未初始化的 int 与整数

2022-09-01 22:00:28

我刚刚在准备考试时学习Java,我遇到了一个未初始化的int/Integer值的问题。

class A
    {
       int x;
       Integer y;
       static int z;
       static Integer z2;
       public A(){}   
    }

假设我初始化了类 A 的对象。A a = 新 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

此外,我在交互窗格中尝试了一些更未初始化的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

但是,我的教授在一次讲座中声称,这些值应该如下所示:

x == 0; Uninitialized
x == null; Undefined
y == 0; java.lang.NullPointerException
y == null; Uninitialized

现在我不想怀疑写考试的人,但是哪个x == 0和y == null truth值是正确的?解释为什么将不胜感激,谢谢。


答案 1
  • a.x == 0- True,因为 a.x 的默认值为 0。
  • a.x == null- 如前所述,这是一个编译时错误。这是从 §15.21.3 中得出的:“如果无法通过强制转换将任一操作数的类型转换为另一个操作数的类型,则会发生编译时错误 (§5.5)。null 类型不能转换为数字。
  • a.y == 0- 这会尝试取消框哪个是空的,所以它会抛出一个 NullPointerException。与上面的(具有文本空值)不同,编译器不会尝试在编译时找出哪个将是空的。a.y,a.y
  • a.y == null- 同样,为 true,因为初始化为 nulla.y
  • a.z == 0- 与(静态除外)相同a.x
  • a.z == null- 与(静态除外)相同a.x
  • a.z2 == 0- 与(静态除外)相同a.y
  • a.z2 == null- 与(静态除外)相同a.y

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


答案 2

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