Java 未初始化整型vs整型

Java 未初始化整型vs整型,java,reference,primitive-types,Java,Reference,Primitive Types,我只是在学习Java为考试做准备,我遇到了一个关于未初始化的int/整数值的问题 class A { int x; Integer y; static int z; static Integer z2; public A(){} } 假设我初始化了一个类A的对象。A=新的A() 我在一个编译器中尝试过这个,并得到了结果 a.x == 0; true a.x == null; Static Error:

我只是在学习Java为考试做准备,我遇到了一个关于未初始化的int/整数值的问题

class A
    {
       int x;
       Integer y;
       static int z;
       static Integer z2;
       public 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/integer比较,看看如果我的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真值是正确的?非常感谢您解释一下原因。

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

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

除了本地人:

单位化整数等于0

单位化整数等于null


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


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

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

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
这就是为什么类中的变量具有以下值:

int x = 0 //default value (value type)
Integer y = null //default values of any object; here Integer is reference type
。。。其他的情况也一样。希望我的答案是有用的

在Java中,类(静态)变量、实例变量(示例中的那些)和数组组件都是默认值。另一方面,局部变量必须显式地给定值,而不获取默认值


有关更多详细信息,请参阅。

由于描述和行为似乎有点不一致,所以这一条以前一直困扰着我。如果您查看中的,有一节描述了这一点,并与您观察到的编译器所做的内容进行了对比

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

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

  • a.x==0
    -为True,因为a.x的默认值为0
  • a.x==null
    -如前所述,这是一个编译时错误。如下所述:“如果无法通过强制转换(§5.5)将任一操作数的类型转换为另一个操作数的类型,则会发生编译时错误。”空类型不能转换为数字
  • a.y==0
    -这会尝试取消对
    a.y,
    的装箱,该值为null,因此会引发NullPointerException。与上面的不同(它有一个文本null),编译器不会在编译时试图判断
    a.y
    将为null
  • 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是局部(未初始化)变量,那么您最后的四次比较都将无法编译。

这个问题是前一段时间提出的,并且提供了正确的答案,但是,我觉得它们可以扩展一些

我想引用官方教程页面上的几句话。

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

局部变量略有不同;编译器从不为未初始化的局部变量指定默认值。 访问未初始化的局部变量将导致编译时错误

在Java中,原语的值是一个数字。(这并不是那么简单,我恳请你多读一些。) 对象的值是可以从中查找对象内容的引用

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

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

事实是:空!=0

  • 0=不表示任何内容的数值
  • null=表示不存在引用的文本。(有关null的更多详细信息,请参见)
仅供参考:我相信Matthew Flaschen已经出色地回答了这个问题,我只是想为那些感兴趣的人添加额外的信息

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。你的老师称它们为未初始化的。他是对的,因为这些值还没有初始化(但它们仍然有默认值)。你的老师想教你总是初始化变量,因为这是一个很好的实践

“单位化对象等于null”-我不这么认为。“单位化int等于0。单位化Integer等于null。”不正确,仅当它们是实例变量而不是局部变量时。@Stas。给我一个非空的单元化对象的例子。@pablosaraiva:“a等于B”表示a.equal(B)=true,imho.@pablo,规范中的默认值仅适用于“类变量、实例变量和数组组件”。该标准不提供将局部变量自动初始化为null。这将是不必要的和低效的,si