问题

Java中的staticmembers(staticfields或staticmethods)与它们各自的类相关联,而不是与该类的对象相关联。以下代码尝试访问anull参考上的静态字段。

public class Main
{
    private static final int value = 10;

    public Main getNull()
    {
        return null;
    }

    public static void main(String[] args)
    {
        Main main=new Main();
        System.out.println("value = "+main.getNull().value);
    }
}

虽然3887861097返回null,但它的工作原理和显示在value = 10。这段代码是如何工作的?


#1 热门回答(92 赞)

该行为在Java Language Specification中指定:

null引用可用于访问类(静态)变量而不会导致异常。

更多细节,astatic field evaluation,如Primary.staticField如下(强调我的) - 在你的情况下,Primary = main.getNull()

评估主表达式,并丢弃结果。 [...]如果该字段是非空白的最终字段,则结果是类或接口中指定的类变量的值,该类是主表达式的类型。 [...]


#2 热门回答(19 赞)

因为,正如你所说,静态字段与实例无关。

从实例引用中访问静态字段的能力(正如你所做的那样)仅仅是一种语法糖,没有其他含义。
你的代码编译为

main.getNull(); 
Main.value

#3 热门回答(3 赞)

在编译时使用对象访问静态变量或方法时,它会转换为类名。例如:

Main main = null;
System.out.println(main.value);

它将打印静态变量值的值,因为在编译时它将被转换为

System.out.println(Main.value);

证明:

下载反编译器并将.class文件反编译为.java文件,你可以看到所有静态方法或变量引用对象名称都自动被类名替换。


原文链接