未初始化的int与Integer

Kev*_*hou 20 java reference primitive-types

我正在研究我的Java以准备考试,我遇到了一些未初始化的int/Integer值的问题.

class A
    {
       int x;
       Integer y;
       static int z;
       static Integer z2;
       public A(){}   
    }
Run Code Online (Sandbox Code Playgroud)

假设我初始化了A类的对象.A a = new A();

我在编译器中尝试了这个并得到了结果

a.x == 0; true
a.x == null; Static Error: Bad type in comparison expression
a.y == 0; java.lang.NullPointerException
a.y == null; true
a.z == 0; true 
a.z == null; Static Error: Bad type in comparison expression
a.z2 == 0; NullPointerException
a.z2 == null; true
Run Code Online (Sandbox Code Playgroud)

此外,我在交互窗格中尝试了一些更未初始化的int/Interger比较,看看如果我的x,y不是上面的类实例变量,我是否会得到不同的结果.

int x;
Integer y;
x == 0; true
x == null; Static Error: Bad type in comparison expression
y == 0; java.lang.NullPointerException
y == null; true
Run Code Online (Sandbox Code Playgroud)

但是,我的教授在一次演讲中声称价值观应如下:

x == 0; Uninitialized
x == null; Undefined
y == 0; java.lang.NullPointerException
y == null; Uninitialized
Run Code Online (Sandbox Code Playgroud)

现在我不想怀疑写考试的人,但是哪个x == 0和y == null真值是正确的?为什么会非常感谢您的解释,谢谢.

Sta*_*lin 18

简单类型的Java值(如int/long)不能为null,因此它们初始化为0.

  • 更正......原始“实例”变量已初始化......本地原始变量不是 - 它们必须被初始化。 (2认同)

Mat*_*hen 18

  • a.x == 0 - 是的,因为ax的默认值为0.
  • a.x == null - 如上所述,这是一个编译时错误.这遵循§15.21.3:"如果无法通过强制转换(§5.5)将任一操作数的类型转换为另一种操作数的类型,则会发生编译时错误." null类型不可转换为数字.
  • a.y == 0- 这会尝试取消设置a.y,为null,因此它会抛出NullPointerException.与上面的(具有文字null)不同,编译器不会尝试在编译时计算出a.ynull.
  • a.y == null- 再次,true因为a.y初始化为null
  • a.z == 0- 与a.x(静态除外)相同
  • a.z == null- 与a.x(静态除外)相同
  • a.z2 == 0- 与a.y(静态除外)相同
  • a.z2 == null- 与a.y(静态除外)相同

交互窗格的问题在于IDE如何实现它.如果x和y是本地(未初始化)变量,则所有四个最后比较都将无法编译.


Nab*_*abb 10

在Java中,类(静态)变量,实例变量(示例中的变量)和数组组件都是默认值.另一方面,局部变量必须明确给定值,并且不能获得默认值.

有关更多详细信息,请参见§4.12.5.