Java:向上升级到超类并从子类

时间:2017-12-13 23:31:43

标签: java polymorphism

我有两个班,狗和比格犬。

Class Dog有方法:bark()

类Beagle有方法:bark()和hunt()

如果我这样做

Dog myDog = new Beagle()
myDog.bark()

这称为Beagle的树皮功能。 但是,如果我说,

myDog.hunt()

Eclipse生成错误。如果myDog仍然是Beagle的实例(假设它调用了Beagle' bark()函数),它仍然可以调用hunt()函数吗?或者,如果它不再是Beagle类型,为什么它不会调用Dog的bark()函数? 我不知道如何将这两种行为相互对立。

1 个答案:

答案 0 :(得分:2)

让我们说你正在编写一个函数

void something(Dog myDog) {
  ...
}

您可以在myDog上打电话给什么?你知道没有关于它是什么类型的Dog。你不知道它是Beagle还是别的什么。但是你希望能够传入BeagleRetriever或任何其他类型的狗,并且可以选择狗种。情况完全相同,无论是方法参数还是局部变量。

当您将myDog定义为类型Dog时,您告诉 Java忘记myDog对象的所有内容,除了它是{{1 }}。 Java正在做你告诉它的事情。它忘记了DogmyDog的{​​{1}}以外的任何方法。

实际使用的bark()方法的实现依赖于对象在运行时具有的实际类。选择这种方法" live"根据实际执行情况进行传递。

可以使用哪些方法在编译时根据变量的类型决定。根据存储在该变量中的实际对象及其创建方式,在运行时决定使用该方法的哪个实现。