我对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
。编译器不关心什么value变量的信息将在执行时显示 - 它仅使用有关声明类型的信息。
所以,这就是它用来尝试查找什么dogMethod()
意思是在上下文中animal
,即类型Animal
。首先它看起来Animal
,然后在java.lang.Object
(隐式超类Animal
) - 但这些类都不包含声明dogMethod
。此时,编译器必须因错误而放弃 - 它找不到该方法。该方法在执行时间处理时间对象的类型 值animal
指。它必须在编译时绑定它,仅使用编译时可用的信息。
唯一的决定是在执行time 是使用方法的实现 - 例如,如果您调用animal.toString()
和Dog
类有一个覆盖,例如
@Override public String toString() {
return "I'm a dog";
}
那么编译器会找到toString()
方法来自java.lang.Object
,所以它会知道方法调用是有效的 - 但是执行 in Dog
由于对象的执行时类型而被使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)