Java接口与继承和多态性

Java接口与继承和多态性,java,inheritance,interface,polymorphism,Java,Inheritance,Interface,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 c

为了从概念上理解继承、接口和多态性,我创建了两个类来进行测试。我得到的结果不是我期望的结果。代码如下:

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");
我没有得到任何错误,说我不能再次实现。但在我的测试中,一旦我创建了PolarBear,我就无法回到动物的compareTo方法,即使PolarBear应该继承动物的compareTo。我测试了以下内容:

Animal bobo = new PolarBear();
bobo.compareTo(null);
((PolarBear) bobo).compareTo(null);
((Animal)bobo).compareTo(null);
((Comparable) bobo).compareTo(null);    
每一张都印着:

 PolarBear.compareTo

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

你总是可以从你的PolarBear内部调用super.compareTo(arg0)来调用放在动物中的逻辑。compareTo.

compareTo和继承通常是一种比较。从理论上讲,将子类与可比较的具体超类相关联会破坏可比较的契约。例如,假设我有一个超类a,它通过检查字段a1和a1与其他a进行比较。现在,让我们添加一个子类B,它有一个额外的字段b1<代码>分析。compareTo(aB)将按a1和a2进行比较,而
((A)aB)。compareTo(anA)
将不进行相同的比较
至于你的问题,你可以只从子类本身调用compareTo的动物版本,方法如下

super.compareTo(<something>)
super.compareTo()

但不是从“外部”,因为您已经重写了该方法。你有责任与外界保持与你刚刚推翻的方法相同的“契约”。

将你的
bobo
对象投射到
PolarBear
Animal
Comparable
,这并不重要,对象的运行时类型将始终是
PolarBear
,因为您将其实例化为

Animal bobo = new PolarBear();
因此,无论何时调用
.compareTo(wtv)
它都将调用
PolarBear
实现

这就是多态性。请仔细阅读,因为这就是如何在java中实现多态性


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

这非常简单。底层对象是PolarBear类,每次都要更改对象的接口(用于保存对象引用的类)

JVM在编译时检查接口(用于保存对象引用的类)中的方法是否存在,但绑定是在运行时发生的,因为Child(PolearBear)拥有该方法,所以它将始终运行该方法

使用super.compareTo()调用父方法


您始终可以从子类调用
super.compareTo()
。这些方法是动态绑定到实例的
bobo
是一个
PolarBear
方法,因此总是调用
compareTo(…)
方法
PolarBear
。为什么要调用其他对象?应该是
implements
,因为您只能在对象内部使用super。您是在一个主函数(它是一个静态函数,不属于任何对象)中这样做的。您必须将super调用放入PolarBear的compareTo方法中该方法需要super.compareTo?如果我想有两种比较方法,一种在动物身上,一种在北极熊身上,用来比较不同的东西呢?将super.compareTo放入PolarBear.compareTo的方法体不会失去这个目的吗?这要看情况而定。由于您正在重写
PolarBear
中的方法,因此通过调用
super.compareTo
,可以从父类扩展功能。你不必这么做。您将无法直接从
PolarBear
实例访问
Animal
的比较器。@user1901074-java库中大多数处理比较的地方都允许您提供一个比较器类,该类可以比较对象,而不是依赖于可比较的对象。这通常是处理具有多个比较实现的场景的方式。