为了从概念上理解继承,接口(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

有什么方法可以访问AnimalcompareTo吗?从逻辑上讲,我是否不希望能够比较PolarBear的动物品质以及PolarBear的品质?

最佳答案

bobo对象强制转换为PolarBearAnimalComparable都没关系,因为将该对象实例化为,该对象的运行时类型始终为PolarBear

Animal bobo = new PolarBear();

因此,每当您调用.compareTo(wtv)时,都会调用PolarBear实现。

这就是多态。阅读late binding,因为这就是在Java中实现polymorphishm的方式。

如果要调用父类的compareTo(wtv)方法,则必须在其他任何子类的方法中执行super.compareTo(wtv)

09-07 06:09