为什么不调用从返回null的静态方法链接的静态变量抛出NPE?

时间:2013-12-18 03:49:34

标签: java static null

我有以下代码

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作为输出可以让任何人澄清吗?

3 个答案:

答案 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)。这一切都可以正常运行,因为您从不使用(并且不需要使用)此类的实例,因此不会出现空指针异常。