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
。这段代码是如何工作的?
发布于 2012-07-20 21:05:32
因为,正如您所说,静态字段并不与实例相关联。
从实例引用访问静态字段的能力(就像您正在做的那样)仅仅是语法上的糖,没有额外的含义。
您的代码将编译为
main.getNull();
Main.value
发布于 2012-12-20 17:52:52
当您在编译时访问带有对象的静态变量或方法时,它会转换为类名。例如:
Main main = null;
System.out.println(main.value);
它将打印静态变量value的值,因为在编译时它将被转换为
System.out.println(Main.value);
证明:
下载反编译器并将您的.class文件反编译为.java文件,您可以看到所有静态方法或变量引用的对象名称都会自动替换为类名称。
发布于 2012-12-26 22:39:49
静态变量和方法始终属于类。因此,当我们创建任何对象时,只有非静态变量和方法与对象一起进入堆,而静态与类一起驻留在方法区域中。这就是为什么当我们试图访问静态变量或方法时,它会转换为类名、点变量或方法名。
请参考下面的链接了解更多详细信息。
http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
https://stackoverflow.com/questions/11579953
复制相似问题