我对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
。编译器不在乎在执行时变量的值是什么-它仅使用有关已声明类型的信息。
因此,它就是用来尝试查找,即typedogMethod()
上下文中的含义的方法。首先它查找,然后是(的隐式超类)-但这些类都不包含的声明。到那时,编译器不得不放弃一个错误-它找不到方法。该方法可在该值所引用的对象的执行时类型上使用。它只能在编译时使用编译时可用的信息来绑定它。animal
Animal
Animal
java.lang.Object
Animal
dogMethod
animal
在执行时唯一的决定是使用哪种方法的实现-例如,如果您调用了animal.toString()
并且Dog
该类具有重写,例如
@Override public String toString() {
return "I'm a dog";
}
那么编译器会发现toString()
,从方法java.lang.Object
,所以它会知道该方法调用是有效的-但在执行中Dog
会因为对象的运行时类型的使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句