未初始化的int与整数

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

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

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

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

 ax == 0; true ax == null; Static Error: Bad type in comparison expression ay == 0; java.lang.NullPointerException ay == null; true az == 0; true az == 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真值是正确的? 关于为什么会非常感谢的解释,谢谢。

  • ax == 0 – 是的,因为ax的默认值为0。
  • ax == null – 如上所述,这是一个编译时错误。 这遵循§15.21.3 :“如果无法通过转换转换(§5.5)将任一操作数的类型转换为另一个操作数的类型,则会发生编译时错误。” null类型不可转换为数字。
  • ay == 0 – 这会尝试取消装入ay,它为null,因此会抛出NullPointerException。 与上面的(具有文字null)不同,编译器不会尝试在编译时弄清楚ay将为null。
  • ay == null – 再次,因为ay被初始化为null
  • az == 0 – 与ax相同(静态除外)
  • az == null – 与ax相同(静态除外)
  • a.z2 == 0 – 与ay相同(静态除外)
  • a.z2 == null – 与ay相同(静态除外)

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

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

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

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

 int x; Integer y; x == 0; true. because x is initialized to 0 by JVM x == null; Static Error: Bad type in comparison expression y == 0; java.lang.NullPointerException y == null; true, because y is uninitialized 
 class A { int x; Integer y; static int z; static Integer z2; public A(){} } 

你的编译器说

 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 

两者都是正确的,除非您的老师使用不同的术语。 原因是默认情况下JAVA将未初始化的值初始化为0或对象初始化为null。 你的老师将他们称为未初始化。 他是对的,因为这些值尚未初始化(但它们仍有默认值)。 您的老师希望教您始终初始化变量,因为这是一种很好的做法。

编辑:不能使用未初始化的局部变量。

除了当地人:

Unitialized int等于0。

Unitialized Integer等于null。

整数是一个对象。 单位对象等于null。

int是基本类型。 语言规范定义它的未初始化值为0。

由于描述和行为似乎有些不一致,因此我之前已经窃听过我。 如果你看一下4.12.5节中的语言规范 ,有一节描述了这一点,并且与你观察到的编译器所做的事情有关。

我认为这有时令人困惑的原因是我从Sun读过的其他出版物(例如“Core Java 2”)描述了你的教授指出的行为。 在另一个变体中,我使用NetBeans,它允许使用未初始化的原语,但标记未初始化对象的使用; 我不确定这是编译器还是IDE的选择。

[编辑:在审阅其中一篇文章后,我认为这种混淆确实源于局部变量与字段的不同行为。]

在实例化对象时,类中的所有对象/变量都被初始化为默认值。

这就是原因,类中的变量具有以下值:

 int x = 0 //default value (value type) Integer y = null //default values of any object; here Integer is reference type 

……其余的情况也类似。 希望我的回答很有用!!!

这个问题在一段时间后被问到,并且提供了正确的答案,但是,我觉得它们可以有所扩展。

我想在官方教程页面中引用几行。 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

声明但未初始化的字段将由编译器设置为合理的默认值

局部变量略有不同; 编译器永远不会为未初始化的局部变量分配默认值。 访问未初始化的局部变量将导致编译时错误。

在Java中,原语具有一个数字值。 (它不是那么简单,我建议你阅读更多关于它的内容。)对象的值是从中可以找到对象内容的引用。

基元的默认值基本上为0,其中对象的默认值为null。 (未初始化时和字段时)

在您的示例中,您尝试比较“0到0,null为null,null为0”。

事实是:null!= 0。

  • 0 =表示无效的数值。
  • null =表示非现有引用的文字。 (您可以在Java中看到什么是null?有关null的更多详细信息)

仅供参考:我相信Matthew Flaschen已经很好地回答了这个问题,我只是想为那些感兴趣的人添加额外的信息。