我正在研究我的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真值是正确的?关于为什么会非常感谢的解释,谢谢。
答案 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。
仅供参考:我相信Matthew Flaschen已经很好地回答了这个问题,我只是想为那些感兴趣的人添加额外的信息。