【问题标题】:Java: upcasting to a superclass and calling function from the subclass [duplicate]Java:向上转换到超类并从子类调用函数[重复]
【发布时间】:2018-05-27 23:20:32
【问题描述】:

我有两个班级,Dog 和 Beagle。

Class Dog 有方法:bark()

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

如果我这样做

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

这会从 Beagle 调用 bark 函数。 但是,如果我说,

myDog.hunt()

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

【问题讨论】:

    标签: java polymorphism


    【解决方案1】:

    假设你正在编写一个函数

    void something(Dog myDog) {
      ...
    }
    

    您可以通过myDog 拨打什么电话?对于Dog 的类型,您一无所知。你不知道是Beagle,还是别的什么。但是您希望能够传递BeagleRetriever 或任何其他种类的狗,并且可以选择狗的种类。情况完全一样,不管是方法参数还是局部变量。

    当您将myDog 定义为具有Dog 类型时,您告诉Java 忘记myDog 对象的所有内容,除了它是Dog。 Java 正在做你告诉它的事情。它忘记了myDog除了Dog中的bark()之外还有其他方法。

    然而,实际使用的bark 方法的实现取决于对象在运行时具有的实际类。该方法是根据碰巧传入的实际实现来选择“实时”的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      相关资源
      最近更新 更多