gpt4 book ai didi

java - Java中父类(super class)引用无法调用子类方法

转载 作者:太空宇宙 更新时间:2023-11-04 09:13:46 27 4
gpt4 key购买 nike

我对 Java 的多态性有一个基本的怀疑。我已将下面的代码写入一个名为 AnimalTestDrive.java 的文件中。根据我的说法,下面的代码应该特别适用于粗体行,但不幸的是它不是。您能解释一下原因吗,我给出了以下错误:

class Dog extends Animal {

public void dogMethod() {
System.out.println("In Dog method");
}
}

public class AnimalTestDrive {
public static void main(String args[]) {
Dog d = new Dog();
d.dogMethod();
d.animalMethod();

Animal animal = new Animal();
animal.animalMethod();

animal = d;
**animal.dogMethod(); // THIS IS NOT WORKING**

}
}

最佳答案

让我们尝试以编译器相同的方式查看这一行:

animal.dogMethod();

首先,它需要弄清楚animal 的含义。这很好也很简单 - 它是当前方法中的局部变量,因此不需要看得太远。

该变量的编译时类型是Animal。编译器并不关心执行时变量的 - 它只使用有关声明类型的信息。

所以,这就是它用来尝试查找 dogMethod()animal 上下文中的含义,即类型 Animal。首先它在 Animal 中查找,然后在 java.lang.Object(Animal 的隐式父类(super class))中查找 - 但这些类都不包含 dogMethod 的声明。此时,编译器必须因错误而放弃 - 它找不到该方法。该方法在 animal 引用的值的对象的执行时类型上可用并不重要。它必须在编译时绑定(bind)它,仅使用编译时可用的信息。

执行时做出的唯一决定是使用哪个方法的实现 - 例如,如果您调用 animal.toString() 并且 Dog 类进行了覆盖,例如

@Override public String toString() {
return "I'm a dog";
}

然后编译器会从 java.lang.Object 中找到 toString() 方法,因此它会知道该方法调用是有效的 - 但由于对象的执行时类型,将使用 Dog 中的实现

关于java - Java中父类(super class)引用无法调用子类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59346470/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com