未初始化的int与Integer

时间:2010-10-08 19:08:25

标签: java reference primitive-types

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

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

假设我初始化了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

此外,我在交互窗格中尝试了一些未初始化的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真值是正确的?关于为什么会非常感谢的解释,谢谢。

9 个答案:

答案 0 :(得分:18)

  • a.x == 0 - 是的,因为a.x的默认值为0.
  • a.x == null - 如上所述,这是一个编译时错误。这来自§15.21.3:“如果无法通过强制转换(第5.5节)将任一操作数的类型转换为另一个操作数的类型,则会发生编译时错误。” null类型不能转换为数字。
  • a.y == 0 - 这会尝试取消设置为{null}的a.y,,因此会抛出NullPointerException。与上面的(具有文字null)不同,编译器不会尝试在编译时弄清楚a.y将为null。
  • a.y == null - 再次,因为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是本地(未初始化)变量,那么最后四次比较都将无法编译。

答案 1 :(得分:17)

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

答案 2 :(得分:10)

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

有关详细信息,请参阅§4.12.5

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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。你的老师将他们称为未初始化。他是对的,因为这些值尚未初始化(但它们仍然具有默认值)。您的老师希望教您始终初始化变量,因为这是一种很好的做法。

答案 5 :(得分:1)

编辑:无法使用未初始化的局部变量。

除了当地人:

Unitialized int等于0.

Unitialized Integer等于null。

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

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

答案 6 :(得分:1)

由于描述和行为似乎有些不一致,因此我之前已经窃听过我。如果您查看language specification中的section 4.12.5,则会有一个描述此内容的部分,并与您在编译器中观察到的内容相符。

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

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

答案 7 :(得分:0)

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

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

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

......其余的情况也是如此。希望我的回答很有用!!!

答案 8 :(得分:0)

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

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

  

声明但未初始化的字段将由编译器

设置为合理的默认值      

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

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

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

在您的示例中,您尝试将" 0与0进行比较,将null与null进行比较,将null与0"进行比较。

事实是:null!= 0。

  • 0 =表示无效的数值。
  • null =表示非现有引用的文字。 (有关null的更多详细信息,您可能会看到What is null in Java?

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