当我尝试从未初始化的类实例打印静态字段值的值时,为什么不抛出空引用异常。
我期望在以下代码中出现Null引用异常:
public class Check {
static int i=1;
public static void main(String []args)
{
Check ch = null;
System.out.print(ch.i);
}
}
生成输出:1
。
答案 0 :(得分:2)
在你的代码片段中,i
是静态的,这意味着它可能不需要实例化,这意味着默认构造函数不需要被调用为:
Check ch= new Check();
因为i
是static
,只有参考就足够了。和你一样,
Check ch = null;
这样做,
System.out.println(ch.i);
将打印静态上下文中的i
值为1
答案 1 :(得分:1)
鉴于i
是static
(可以通过类直接访问,不需要使用实例),代码 ch.i
,编译器检查 ch
(Check
)的引用类型,并使用它来访问变量i
,而不是使用类实例。这意味着null
(实例)根本不被使用(因此我们没有任何例外)。
就是这样,Check.i
的输出是1
。
答案 2 :(得分:1)
因为i是一个静态变量,所以它的值是从对象还是从类中获取并不重要。
请参阅此处的说明:
https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html