最近我经历了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
}
}
答案 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
。