2016-08-22 91 views
0

我想确定什么是Java中已声明但未初始化的变量/对象的状态。在Java中声明的未初始化变量会怎样?它有价值吗?

我不能实际测试它,因为我不断得到“未初始化”警告,我似乎无法抑制它,并且无法进行测试,如果我初始化变量。

虽然例如,我猜如果变量是integer它可能等于。

但是,如果变量是一个字符串,将等于nullisEmpty()将返回true

所有非初始化变量的值是否相同?或者每个声明(含义,int,string,double等)在未初始化时都有不同的值?


**** ****更新

因此,正如我现在看到的,它使一个很大的区别,如果变量声明为locallyClass,但我似乎无法理解为什么当在类中声明为静态时它不会给出任何错误,但是当在main中声明时它会生成"Not Initialized" error

+1

它取决于一个类变量还是一个局部变量?一个类变量要么是'null',要么是它的代表默认值,局部变量不能被单元化。 – SomeJavaGuy

+0

那么有没有办法不初始化一个局部变量?嗯,让我们说它的一个类变量,在任何情况下,它会是空的?我会得到整数,但对于字符串等仍然是空? – hedgehog

+1

如果声明一个对象,比如'String myString;'但是别的什么都不做,那么在运行时使用'myString.isEmpty()'会产生一个'nullPointerException'。 基本上默认为'0','0.0'等.... – jr593

回答

2

JVM的确切程度如何完全取决于JVM,对于程序员来说应该不重要,因为编译器确保您不读取未初始化的本地变量。

字段然而是不同的。它们在读取之前不需要分配(除非它们是final)并且未分配的字段值为参考类型的null或适当基元类型的0值(如果该字段具有基元类型)。

s.isEmpty()用于字段String s;尚未分配结果NullPointerException


因此,正如我现在看到的,它使得如果变量声明为locallyClass,但我似乎无法理解为什么在类声明时,它提供没有错误有很大的区别,但是在主体中声明时会产生"Not Initialized"错误。

一般来说,使用没有值的值是不可取的。为此,语言设计者有两种选择:

a)为尚未初始化的变量定义默认值
b)防止程序员在写入变量前访问变量。 b)很难实现领域,因此选择a)选择领域。 (根据调用的顺序,可能有多种读取/写入方法可能是有效的或无效的,这些只能在运​​行时确定)。

对于局部变量选项b)是可行的,因为可以为赋值语句检查所有可能的方法执行路径。这个选项是在局部变量的语言设计中选择的,因为它可以帮助发现许多简单的错误。

+0

我明白现在,你是否也可以看到更新并告诉我这个呢? – hedgehog

+1

@hedgehog相同的答案,将其声明为类级别的静态变量,并将其用静态方法在本地进行延迟 – SomeJavaGuy