为了从概念上理解继承,接口(interface)和多态性,我创建了两个类来测试事物。我得到的结果不是我预期的结果。代码如下:
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
实现。这就是多态。阅读late binding,因为这就是在Java中实现polymorphishm的方式。
如果要调用父类的
compareTo(wtv)
方法,则必须在其他任何子类的方法中执行super.compareTo(wtv)
。