当前位置: 首页 > 知识库问答 >
问题:

Java:向上转换到超类并从子类[duplicate]调用函数

孙福
2023-03-14

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

类狗有方法:bark()

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

如果我这样做

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

这调用了Beagle的树皮函数。然而,如果我说,

myDog.hunt()

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

共有1个答案

夹谷飞龙
2023-03-14

假设您正在编写一个函数

void something(Dog myDog) {
  ...
}

你可以在myDog上调用什么?你不知道这是什么样的狗。你不知道它是一只小猎犬还是其他什么东西。但是你想要能够通过一只小猎犬、一只寻回犬或任何其他种类的狗,并且可以选择狗的种类。无论是方法参数还是局部变量,情况都完全相同。

当您将myDog定义为具有类型时,您告诉Java忘记关于myDog对象的一切,除了它是一个狗。Java正在做你告诉它的事情。它忘记了,myDog有任何方法,而不是来自狗的吠声()。

然而,实际使用的bark方法的实现取决于对象在运行时拥有的实际类。该方法被选择为“实时”,这取决于实际实现被传入。

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

 类似资料:
  • 问题内容: 我正在尝试创建一个将字段作为参数的构造函数,然后将其放入存储在超类中的字段中。这是我正在使用的代码 在超类中,我用 我有一个访问器方法 我收到一个错误“ 味道在超类中具有私有访问权 ”,但是我认为这无关紧要,因为我正在调用将其返回到字段的访问器方法? 问题答案: 您应该做什么: 在您的超类中添加一个构造函数: 在Crisps类中: 注释 对您的问题的一些评论: “在超类中,我已经用”

  • 问题内容: 我正在学习Java入门课程,我们才刚刚开始学习继承。我正在完成一项任务,要求我们创建一个具有名称和年龄的“宠物”超类。和三个子类,每个子类都有自己的独特特征(我选择了“狗”,“猫”和“鸟”)。构建完所有这些之后,我们将创建一个Main类来测试所有内容,这就是我遇到问题的地方。我试图在中调用这些独特特征的方法,但似乎只能找到超类中的方法。 这是主类: 这是我的超人 这是子类之一(它们看起

  • 为什么第一个输出有柱线 = 空?是因为在创建类 B 之前调用了 B.foo() 吗?如果是,那么为什么可以调用 B.foo()?还是因为 B.foo() 中的字段栏试图从 A 获取柱线字段但无法访问它? 我的问题与链接的问题不同,我不是在问调用顺序,我是在问为什么第一个输出为空?另一个问题不是关于字段或空变量。 我不明白B.foo中的bar变量是如何为空的,如果它是在A和B中定义的。

  • 问题内容: 程序将返回3,而我的预期值为0。为什么方法f中的第一个强制转换什么都不做,而第二个有效?是因为在A和B类中,met方法被重载,因此使用静态绑定吗? 问题答案: 这就是多态性的工作方式。请考虑以下示例: 如预期的那样,将调用正确的方法。对象的方法表不仅仅因为更改存储在其中的变量的类型而改变,因为an 和它的方法之间的绑定比存储类型和与其相关的方法之间的绑定更强大。第二种类型起作用,因为输

  • 您可以看到,我正在将“that”作为参数传递给PrintInfo。如果没有“that”参数,“info”将打印为“undefined”。像下面的例子一样,当从“子类”的对象调用此函数时,“this.info”是未定义的。 如何在javascript中重写和调用超类的方法,使函数能够访问类的实例变量?

  • 我正在学习java入门课程,我们刚刚开始学习继承。我正在做一项任务,要求我们创建一个具有名称和年龄的“Pet”超类;和三个子类,每个都有自己独特的特征(我选择了“狗”、“猫”和“鸟”)。在我们构建了所有这些之后,我们将创建一个主类来测试一切,这就是我遇到问题的地方。我试图为这些独特的特性调用