Java 接口(interface)和继承与多态性

标签 java inheritance interface polymorphism

为了从概念上理解继承、接口(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 中实现多态性的方式。

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

关于Java 接口(interface)和继承与多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14241996/

相关文章:

java - 如何在 WAS Liberty 8.5.5.9 中使用 securityUtility --encoding=custom?

java - JDBC 何时自动提交提交

java - 正确实现三次样条插值

Django 自动从抽象元类继承 "abstract = true"

c# - 在设计 C# 类库时,什么时候应该选择继承而不是接口(interface)?

java - CompassADFAdaptor 类型中的错误 : The method convertProspectIds(Map<String, String>) 不适用于参数 (List<String>)

c++ - 在 C++ 中的派生类之间切换

grails - 如何从非域类继承 GORM 映射?

Java - 如何查找由特定接口(interface)或 super 接口(interface)名称扩展的接口(interface)

java - 弹珠程序未删除