static
成员( static
字段或static
在Java方法)与它们各自的类而不是这个类的对象相关联。 下面的代码试图访问一个静态字段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
。 请问这个代码工作的?
这种行为是在指定的Java语言规范 :
空引用可用于访问类(静态)变量,而不会引起一个异常。
在更多的细节,一个静态的现场评估 ,如Primary.staticField
工作原理如下(重点煤矿) -在你的情况, Primary = main.getNull()
- 主表达式进行求值,并且结果被丢弃 。 [...]
- 如果该字段是一个非空最后字段,那么结果是在类或接口是主表达式的类型指定的类变量的值。 [...]
因为,如你所说,静态字段没有与实例相关联。
从实例引用访问静态字段(如你正在做)的能力仅仅是一个语法糖,并且没有额外的意义。
您的代码编译成
main.getNull();
Main.value
当你曾经访问静态变量或方法在编译时它的对象转换为类的名称。 例如:
Main main = null;
System.out.println(main.value);
将打印的静态变量的值的值,因为在编译时这将被转换为
System.out.println(Main.value);
证明:
下载反编译和反编译你的.class文件,java文件,你可以看到所有静态方法或变量引用对象名称自动类名称所取代。
静态变量和方法永远属于类。 所以,当我们曾经创建的任何对象只非静态变量和方法去与对象,但静态驻留在类方法区堆一起。 这就是为什么当我们曾经试图访问其转换为类名的静态变量或方法点变量或方法的名称。
请参考以下链接了解更多详情。
http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html