[英]Java Interfaces and Inheritance and Polymorphism
为了概念上理解继承,接口和多态,我创建了几个类来测试事物。 我得到的结果不是我预期的结果。 代码如下:
public class Animal implements Comparable{
//Animal constructor & methods
public int compareTo(Object arg0){System.out.println("Animal.compareTo");}
}
public class Bear extends Animal{
//Bear constructor & methods
}
public class PolarBear extends Bear implements Comparable{
//PolarBear constructor & methods
public int compareTo(Object arg0) {System.out.println("PolarBear.compareTo");
我没有得到任何错误,说我无法再次实现Comparable。 但是在我的测试中,一旦我创建了PolarBear,我就无法回到Animal的compareTo方法,即使PolarBear应该继承Animal的compareTo。 我测试了以下内容:
Animal bobo = new PolarBear();
bobo.compareTo(null);
((PolarBear) bobo).compareTo(null);
((Animal)bobo).compareTo(null);
((Comparable) bobo).compareTo(null);
并且他们每个人印刷:
PolarBear.compareTo
有没有办法访问Animal
的compareTo
? 从逻辑上讲,我不希望能够比较PolarBear
的动物品质以及PolarBear
品质吗?
将bobo
对象转换为PolarBear
, Animal
或Comparable
并不重要,对象的运行时类型将始终为PolarBear
因为您将其实例化为
Animal bobo = new PolarBear();
因此,无论何时调用.compareTo(wtv)
它都会调用PolarBear
实现。
这就是多态性。 阅读后期绑定,因为这是在java中实现polymorphishm的方式。
如果要调用父类的compareTo(wtv)
方法,则必须在任何其他子类的方法中执行super.compareTo(wtv)
。
compareTo和inheritence通常是一个棘手的业务 。 理论上,拥有可比较的具体超类的子类会打破可比较的合同。 例如 - 假设我有一个超类A,它通过检查字段a1和a1与其他A进行比较。 现在让我们添加一个具有额外字段b1的子类B. anA.compareTo(aB)
将比较a1和a2而((A)aB).compareTo(anA)
不会做同样的事情
至于你的问题 - 你可以通过做类似的事情从子类本身调用compareTo的Animal版本
super.compareTo(<something>)
但不是来自“外部”,因为你已经覆盖了这个方法。 您有责任与您刚刚覆盖的方法保持与外界相同的“合同”。
您始终可以从PolarBear中调用super.compareTo(arg0)来调用Animal.compareTo中的逻辑。
这很简单。 底层对象是PolarBear类,您每次都要更改对象的接口(用于保存对象引用的Class)。
JVM在编译时检查接口中的方法(用于保存对象引用的类)是否存在,但是绑定是在运行时进行的,因为Child(PolearBear)具有该方法,因此它将始终运行该方法。
使用super.compareTo()来调用父方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.