我有两个班,狗和比格犬。
Class Dog有方法:bark()
类Beagle有方法:bark()和hunt()
如果我这样做
Dog myDog = new Beagle()
myDog.bark()
这称为Beagle的树皮功能。 但是,如果我说,
myDog.hunt()
Eclipse生成错误。如果myDog
仍然是Beagle
的实例(假设它调用了Beagle' bark()
函数),它仍然可以调用hunt()
函数吗?或者,如果它不再是Beagle
类型,为什么它不会调用Dog的bark()
函数?
我不知道如何将这两种行为相互对立。
答案 0 :(得分:2)
让我们说你正在编写一个函数
void something(Dog myDog) {
...
}
您可以在myDog
上打电话给什么?你知道没有关于它是什么类型的Dog
。你不知道它是Beagle
还是别的什么。但是你希望能够传入Beagle
,Retriever
或任何其他类型的狗,并且可以选择狗种。情况完全相同,无论是方法参数还是局部变量。
当您将myDog
定义为类型Dog
时,您告诉 Java忘记myDog
对象的所有内容,除了它是{{1 }}。 Java正在做你告诉它的事情。它忘记了Dog
除myDog
的{{1}}以外的任何方法。
实际使用的bark()
方法的实现依赖于对象在运行时具有的实际类。选择这种方法" live"根据实际执行情况进行传递。
可以使用哪些方法在编译时根据变量的类型决定。根据存储在该变量中的实际对象及其创建方式,在运行时决定使用该方法的哪个实现。