如何从空引用访问静态变量?

Lal*_*Rao 4 java static nullreferenceexception

最近我正在浏览javarevisited页面并找到一段代码,要求读者确定它的输出是什么......

虽然我得到了输出,但我对结果不满意(因为我不知道如何从空引用访问静态成员).背景中发生了什么?

public class StaticDEMO {

    private static String GREET = "Hello";

    public static void main(String[] args) {
        StaticDEMO demo = null;
        System.out.println(demo.GREET);
        // TODO code application logic here
    }
}
Run Code Online (Sandbox Code Playgroud)

Tod*_*odd 12

这是有效的,因为JVM知道您正在尝试访问特定类的静态成员.因为您必须声明demo为特定类(在本例中为a StaticDEMO),所以它知道使用它来查找GREET.

要清楚,你不要经常碰到这个(我实际上必须输入这个代码来验证它,我不能说我见过这个).主要是,总是通过类来引用静态字段,而不是对象实例(可能是null,我们可以看到!)是一种好习惯.

意思是,更喜欢这个:

System.out.println(StaticDEMO.GREET);
Run Code Online (Sandbox Code Playgroud)

编辑

我在Java规范中找到了对此的引用:第15章,第11节:字段访问表达式.

例15.11.1-2.接收器变量与静态现场访问无关

以下程序演示了可以使用null引用来访问类(静态)变量而不会导致异常

[为简洁起见未在此处显示]

  • 因为它根本没有使用引用,只是引用的类型.即使您使用对象而不是类来引用静态字段,JVM也会知道对象的类型(CLASS)并在封面下使用它.该规范明确称之为合法(第15.11.1节). (3认同)