为了账号安全,请及时绑定邮箱和手机立即绑定

Java中空引用上的静态字段

Java中空引用上的静态字段

qq_笑_17 2019-10-26 13:32:15
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表达式的类型。[...]


查看完整回答
反对 回复 2019-10-26
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

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


从实例引用访问静态字段的能力(就像您正在做的那样)仅仅是一种语法糖,没有其他意义。

您的代码编译为


main.getNull(); 

Main.value


查看完整回答
反对 回复 2019-10-26
?
翻阅古今

TA贡献1780条经验 获得超5个赞

每当您在编译时使用对象访问静态变量或方法时,它都会转换为Class名称。例如:


Main main = null;

System.out.println(main.value);

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


System.out.println(Main.value);

证明:


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


查看完整回答
反对 回复 2019-10-26
  • 3 回答
  • 0 关注
  • 400 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信