我对 Java 中引用变量的动态/静态类型和动态方法解析的概念有点困惑。
考虑:
public class Types {
@Override
public boolean equals(Object obj){
System.out.println("in class Types equals()");
return false;//Shut-up compiler!
}
public static void main(String[] args){
Object typ = new Types();
typ.equals("Hi");//can do this as String is a subclass of Object
}
}
首先:引用变量typ
是类型Types,不是吗?!
那么为什么 typ 有一个静态类型对象和一个动态类型类型来覆盖方法?
其次:编译器没有足够的信息来调用正确的equals()吗?
如果类 Types 没有重写的 equals(),那么它可以调用 Object.equals()
方法。
在这种情况下,类 Types 可以,并且编译器知道这一点。
为什么这不能像重载一样进行早期绑定(bind)?为什么将它留给 JVM?
最佳答案
这是面向对象编程的基本基石。
它归结为多态性。参见 here进一步阅读。
您绝对希望子类 可以覆盖行为;因为这允许您保持客户端代码不变;但你仍然能够引入新的/不同的行为;只需将另一个 对象传递给该客户端代码即可。
客户端代码知道调用哪个方法;但是 dispatch 必须在运行时发生。仅仅是因为编译器不知道(在大多数情况下)传入参数的确切类型。
关于java - 在像 Java 这样的静态类型语言中动态方法解析背后的原因是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44760553/