我对 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 会这样做,并且编译器知道它。
为什么这不能是像重载那样的早期绑定?为什么要把它留给 JVM?
这是一基本的面向对象编程的基石。
归结为多态性. See here https://stackoverflow.com/questions/12893907/are-polymorphism-overloading-and-overriding-similar-concepts供进一步阅读。
你绝对想要那个子类可以覆盖行为;因为这可以让你保留客户代码不变;但你仍然可以引入新的/不同的行为;只需通过another反对该客户端代码。
客户端代码知道调用哪个方法;但是dispatch必须在运行时发生。很简单,因为编译器可以not知道(对于大多数情况)exact传入参数的类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)