我正在itester.org进行测试,发现了一个我不明白的问题:
public class Runner
{
public static Integer i;
public static void main(String[] args)
{
if (i == 42) {
System.out.printf("wow");
}
}
}
我之前读过,默认情况下会分配整数变量0
。为什么在这里分配null
?
答案 0 :(得分:7)
任何引用类型(即任何类型为Object或Object的子类的变量)的默认值为null。这包括Integer
。
另一方面,原始int
的默认值为0.
答案 1 :(得分:5)
因为JLS 4.12.5. Initial Values of Variables:
对于所有引用类型(§4.3),默认值为null。
由于Integer
是引用类型,因此获得null
:
ReferenceType:
ClassOrInterfaceType
TypeVariable
ArrayType
查看其他类型的链接
答案 2 :(得分:5)
默认情况下,基元int
类型被指定为0,但默认情况下Integer
引用指定为null。 Integer
是wrapper class - 它是一个对象,而不是一个原始类型。
您可能希望阅读Java中的autoboxing and unboxing,这是Java在原始类型和包装类之间自动转换的过程。
答案 3 :(得分:2)
在Java中,Integer是一种对象类型。在此示例代码中,您需要基本类型,即int。在Java中,任何对象类型/引用类型或任何未初始化的对象类型变量的子类型都会自动初始化为null。原始类型具有默认值。
背后的原因是, 对象提供多态性的工具,通过引用传递(或者更准确地说具有通过值传递的引用),并从堆中分配。相反,基元是不可变类型,它们通过值传递,并且通常从堆栈中分配。
答案 4 :(得分:1)
如果未明确指定,则将所有非原始非局部变量分配给null
。
答案 5 :(得分:1)
Integer是一个包装类,在这个代码示例中,我是引用变量。 (在java中,一切都不是对象所以我们使用包装类来使对象和java执行装箱和拆箱)所有java中的引用变量默认为null值,所有基本类型都有其默认值(例如int i - > 0)
使用: - 私有静态int;那么它的默认值为0。