当我运行此代码时,它打印两次0,但我不明白为什么在影响对象k以使null为空后,count的值仍打印为0,但是当我在count之前删除static并执行该程序时,它首先打印0,然后我打印一个例外 线程“主”中的异常java.lang.NullPointerException。 请您能解决这个问题。
public class Test{
public static int count=0;
public static void main(String[] args){
Test t = new Test();
System.out.println(t.count); // 0
t=null;
System.out.println(t.count); // 0
}
}
答案 0 :(得分:1)
我认为,您的意思是t=null;
而不是k=null;
。
在整个程序中,静态变量始终只存在一次,它们不会弯曲到对象上。 Test的所有实例始终具有相同的计数。如果将其设置为其他任何值,它将在所有实例中更改。因此,您也可以从null读取值。或者,您可以使用System.out.println(Test::count)
,它也将打印0,而不需要Test类的任何对象。
答案 1 :(得分:1)
static
变量是在类级别定义的,您不需要该类的对象即可引用静态变量。
而且即使您编写t.count
,JVM也会改为执行常规的Test.count
(它将变量名替换为其类名)。
以下是JLS的摘录:https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.11.1
示例15.11.1-2。接收器变量与静态字段无关 访问
以下程序演示了可以使用空引用 访问类(静态)变量而不会引起异常:
Class Test3 { static String mountain =“ Chocorua”; 静态Test3 favorite(){ System.out.print(“ Mount”); 返回null; } 公共静态void main(String [] args){ System.out.println(favorite()。mountain); }编译,执行和打印:
Chocorua挂接即使favourite()的结果为null, 不引发NullPointerException。那个“挂载”被打印出来 证明主要表达确实在 尽管仅使用其类型而不使用其值,但运行时 确定要访问哪个字段(因为字段山是 静态)。