staticJava中的成员(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。此代码如何工作?
3 回答
鸿蒙传说
TA贡献1865条经验 获得超7个赞
该行为在Java语言规范中指定:
空引用可用于访问类(静态)变量,而不会引起异常。
更详细地讲,进行静态评估,例如Primary.staticField以下工作(重点是我的工作)-在您的情况下Primary = main.getNull():
计算主表达式,并丢弃结果。[...]
如果该字段是非空白的final字段,则结果是在类或接口中指定的类变量的值,该变量是Primary表达式的类型。[...]
回首忆惘然
TA贡献1847条经验 获得超11个赞
正如您所说,因为静态字段不与实例关联。
从实例引用访问静态字段的能力(就像您正在做的那样)仅仅是一种语法糖,没有其他意义。
您的代码编译为
main.getNull();
Main.value
翻阅古今
TA贡献1780条经验 获得超5个赞
每当您在编译时使用对象访问静态变量或方法时,它都会转换为Class名称。例如:
Main main = null;
System.out.println(main.value);
它将打印静态变量value的值,因为在编译时它将被转换为
System.out.println(Main.value);
证明:
下载反编译器并将您的.class文件反编译为.java文件,您会看到所有静态方法或变量引用的对象名将自动替换为类名。
添加回答
举报
0/150
提交
取消
