具有空引用的静态变量

时间:2019-05-11 12:19:00

标签: java static static-variables

当我运行此代码时,它打印两次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
    }
}

2 个答案:

答案 0 :(得分:1)

我认为,您的意思是t=null;而不是k=null;

在整个程序中,静态变量始终只存在一次,它们不会弯曲到对象上。 Test的所有实例始终具有相同的计数。如果将其设置为其他任何值,它将在所有实例中更改。因此,您也可以从null读取值。或者,您可以使用System.out.println(Test::count),它也将打印0,而不需要Test类的任何对象。

答案 1 :(得分:1)

Java中的

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。那个“挂载”被打印出来   证明主要表达确实在   尽管仅使用其类型而不使用其值,但运行时   确定要访问哪个字段(因为字段山是   静态)。