Java接口和继承与多态

use*_*074 2 java polymorphism inheritance 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");
Run Code Online (Sandbox Code Playgroud)

我没有得到任何错误,说我无法再次实现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);    
Run Code Online (Sandbox Code Playgroud)

并且他们每个人印刷:

 PolarBear.compareTo
Run Code Online (Sandbox Code Playgroud)

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

Sot*_*lis 7

bobo对象转换为PolarBear,Animal或者Comparable,对象的运行时类型始终是PolarBear因为您将其实例化为

Animal bobo = new PolarBear();
Run Code Online (Sandbox Code Playgroud)

因此,无论何时调用.compareTo(wtv)它都会调用PolarBear实现.

这就是多态性.阅读后期绑定,因为这是在java中实现polymorphishm的方式.

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

  • @ user1901074 - 大多数处理java库中比较的地方允许你提供一个Comparator类,它可以比较对象,而不是依赖于可比较的对象.这通常是您处理多个比较实现的方案. (2认同)