问题
Java中的static
members(static
fields或static
methods)与它们各自的类相关联,而不是与该类的对象相关联。以下代码尝试访问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文件,你可以看到所有静态方法或变量引用对象名称都自动被类名替换。