This question already has answers here:
Calling a subclass method from superclass
                                
                                    (4个答案)
                                
                        
                        
                            Is it possible to call subclasses' methods on a superclass object?
                                
                                    (9个答案)
                                
                        
                2年前关闭。
            
        

我有两个班,狗和小猎犬。

狗类具有方法:bark()

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

如果我做

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


这从Beagle调用了树皮函数。
但是如果我说

myDog.hunt()


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

最佳答案

假设您正在编写一个函数

void something(Dog myDog) {
  ...
}


您可以在myDog上调用什么?您对Dog是什么一无所知。您不知道它是Beagle还是其他名称。但是,您希望能够传递BeagleRetriever或任何其他种类的狗,并可以选择对狗种类重要的东西。情况完全相同,无论是方法参数还是局部变量。

当将myDog定义为Dog类型时,就是在告诉Java忘记有关myDog对象的所有内容,只是它是Dog。 Java正在执行您所说的。它已经忘记了myDog除了bark()中的Dog之外还有其他方法。

但是,实际使用的bark方法的实现取决于对象在运行时具有的实际类。该方法被选择为“实时”的,基于实际发生的实际实现。

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

07-27 13:48