加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

是否允许Java编译器对静态调用具有流敏感性?

发布时间:2020-12-14 19:20:18 所属栏目:Java 来源:网络整理
导读:以下是JLS第8.4.8.2节的简要示例. class Super { static String greeting() { return "Goodnight"; } String name() { return "Richard"; }}class Sub extends Super { static String greeting() { return "Hello"; } String name() { return "Dick"; }}clas

以下是JLS第8.4.8.2节的简要示例.

class Super {
    static String greeting() { return "Goodnight"; }
    String name() { return "Richard"; }
}
class Sub extends Super {
    static String greeting() { return "Hello"; }
    String name() { return "Dick"; }
}
class Test {
    public static void main(String[] args) {
        Super s = new Sub();
        System.out.println(s.greeting() + "," + s.name());
    }
}

根据该示例的讨论,运行main()的输出将是“Goodnight,Dick”.这是因为静态方法是根据调用它们的变量/表达式的静态类型调用的.

这是我的问题:任何即使是中等流量敏感的编译器也可能会发现在调用时存储在s中的任何对象的类型必须始终为Sub,因此如果允许编译器使用该信息,那么即使调用静态方法也可以有一些动态绑定的感觉.为什么不允许这样做? Java是否有明确的目标,即每个编译器生成的行为完全相同的字节码还是有其他原因?

最佳答案
事实上,这里的s.greeting()等同于Super.greeting(),因为s被定义为Super,而静态方法不关心类实例.你肯定知道他们是全班同学.因此从类实例调用静态方法是没有意义的.当然,实例s是您指定的Sub(),因此调用非静态方法Sub.name().

从Java official tutorials开始:

You can also refer to static fields with an object reference like

myBike.numberOfBicycles

but this is discouraged because it does not make it clear that they
are class variables.

允许静态方法是类实例的只会使代码更不易读,更晦涩难以调试而不真正添加任何有用的功能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读