Static fields on a null reference in Java

Java 中的 static成员(static字段或 static方法)与它们各自的类相关联,而不是与这个类的对象相关联。下面的代码尝试访问 null引用上的静态字段。

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()返回 null,但它工作并显示 value = 10。这段代码是如何工作的?

8837 次浏览

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

从实例引用访问静态字段的能力(正如您正在做的那样)仅仅是一种语法糖,没有额外的含义。
Your code compiles to

main.getNull();
Main.value

这种行为在 Java Language Specification中有明确规定:

空引用可用于访问类(静态)变量而不引起异常。

更详细地说,静态现场评价静态现场评价,例如 Primary.staticField的工作原理如下(重点是我的)-在您的例子中,Primary = main.getNull():

  • 计算主表达式和 the result is discarded。[ ... ]
  • 如果该字段是非空的 final 字段,则 the result is the value of the specified class variable in the class or interface that is the type of the Primary expression.[ ... ]
  1. Accessing a static member with the class name is legal, but its no 被写入,一个不能访问的 static成员使用 对象引用变量。所以它在这里工作。

  2. 允许 null对象引用变量访问 static类 变量而不在编译或运行时引发异常 时间

当您在编译时访问带有对象的静态变量或方法时,它会转换为 Class name。例如:

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

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

System.out.println(Main.value);

证据:

下载反编译器并反编译您的。类文件。Java 文件,可以看到所有静态方法或变量引用的对象名自动替换为类名。

Static variable and method always belong to class. So when ever we create any object only non static variable and methods goes to heap along with object but static resides in method area with class. That's why when ever we try to access a static variable or method it converted to class name dot variable or method name.

详情请参阅以下连结。

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html