Java 中空引用上的静态字段

2022-08-31 09:02:49

staticJava 中的成员(字段或方法)与其各自的类相关联,而不是与此类的对象相关联。下面的代码尝试访问引用上的静态字段。staticstaticnull

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);
    }
}

虽然返回 ,但它可以工作并显示 。此代码如何工作?main.getNull()nullvalue = 10


答案 1

该行为在 Java 语言规范中指定:

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

更详细地说,静态字段评估,例如的工作原理如下(强调我的) - 在您的情况下,:Primary.staticFieldPrimary = main.getNull()

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

答案 2

因为,正如您所说,静态字段不与实例关联。

从实例引用访问静态字段的能力(就像您正在做的)只是一个语法糖,没有其他含义。
您的代码将编译为

main.getNull(); 
Main.value

推荐