我有以下代码
public class Test {
static String mountain = "Everest";
static Test favorite() {
System.out.print("Mount ");
return null;
}
public static void main(String[] args) {
System.out.println(favorite().mountain);
}
}
我认为它会引发NPE
,但它会提供Mount Everest
作为输出可以让任何人澄清吗?
答案 0 :(得分:4)
恰好可以访问对象引用上的静态成员。在这种情况下,成员将根据引用的类型进行解析,而不是其值。
Java Language Specification说明static
成员
如果该字段是非空白的最终字段,则结果为该值 在类或接口中指定的类变量的 主要表达的类型。
如果该字段不是最终,或者是空白的最终字段和字段访问权限 发生在构造函数中,然后结果是变量,即 类中指定的类变量,它是Primary的类型 表达强>
所以实例 Primary 并不重要。
答案 1 :(得分:3)
当您访问类实例上的static
成员时,Java编译器会完全忽略变量的运行时值(甚至类)并使用属于声明的类的成员。在这种情况下,您的代码相当于:
favorite();
System.out.println(Test.mountain);
即使你有这样的代码:
public class SubTest extends Test {
static String mountain = "Kilimanjaro";
}
...
Test foo = new SubTest();
System.out.println(foo.mountain);
你仍然可以获得Test
课程的价值。
答案 2 :(得分:0)
favorite()
是一个返回Test
类型的静态方法。然后使用此类的静态变量(mountain
)。这一切都可以正常运行,因为您从不使用(并且不需要使用)此类的实例,因此不会出现空指针异常。