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

时间:2015-01-07 05:57:18

标签: java static nullreferenceexception

最近我经历了a page on 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
    }
}

4 个答案:

答案 0 :(得分:12)

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

要说清楚,你不要经常遇到这种情况(我实际上必须输入这些代码来验证它,我不能说我曾经见过这个)。主要是,总是通过类来引用静态字段,而不是对象实例(可能是null,我们可以看到!)是一种很好的做法。

意思,更喜欢这个:

System.out.println(StaticDEMO.GREET);

修改

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

  

例15.11.1-2。接收器变量与静态现场访问不相关

     

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

     

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

答案 1 :(得分:4)

在Java中被装饰为静态的任何方法都意味着,该方法是类级别的方法。这意味着,您不需要一个对象来识别静态成员。静态方法/变量由类本身维护,而不是由类的任何实例维护。在您的示例中,编译器已经知道该成员是静态成员,并且它不需要任何实例来访问该静态方法。

答案 2 :(得分:2)

静态成员与Class一起存储,而不是与其任何特定实例一起存储。因此,实例为null并不重要 - 来自Class的成员仍然可以访问。

答案 3 :(得分:0)

JVM只是忽略null,因为GREET是一个类字段,demo是引用Class字段的无关引用。

Static方法不需要对象引用来调用它,所以你可以调用它甚至引用对象是null