gpt4 book ai didi

java - 是否允许 Java 编译器对静态调用敏感?

转载 作者:搜寻专家 更新时间:2023-10-31 20:14:30 25 4
gpt4 key购买 nike

这是 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 ,因此,如果允许编译器使用该信息,那么即使调用静态方法也可以有一些动态绑定(bind)的感觉。为什么不允许这样做? Java 是否有一个明确的目标,即每个编译器都生成行为完全相同的字节码,还是有其他原因?

最佳答案

实际上这里的s.greeting()等同于Super.greeting() 因为s被定义为Super 和静态方法不关心类实例。你肯定知道,它们是全类(class)的。所以直接从类实例调用静态方法是没有意义的。当然,实例 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.

允许静态方法明智地使用类实例只会降低代码的可读性、更加神秘和难以调试,而不会真正添加任何有用的功能。

关于java - 是否允许 Java 编译器对静态调用敏感?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11460035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com