我对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** } }
Let’s try to look at this line the same way that the compiler would:
animal.dogMethod();
首先,它需要弄清楚是什么animal意思。很好而且很容易-它是 当前方法中的局部变量,因此它不需要花很多时间。
该变量的编译时类型为Animal。编译器不在乎在执行时变量 的值是什么-它仅使用 有关已声明类型的信息。
因此,这就是它用来尝试查找,即type 上下文中的dogMethod()含义的方式。首先它查找,然后 是(的隐式超类)-但 这些类都不包含的声明。到那时, 编译器不得不放弃一个错误-它找不到方法。这并不 重要,该方法是可用的执行时间的对象的类型 的是该值是指。它 只能在编译时使用编译时可用的信息来绑定它。 animalAnimalAnimaljava.lang.ObjectAnimaldogMethod
dogMethod()
animalAnimalAnimaljava.lang.ObjectAnimaldogMethod
animal
在执行时唯一的决定是使用哪种方法的实现-例如,如果您调用了animal.toString()并且Dog该类具有重写,例如
@Override public String toString() { return "I'm a dog"; }
那么编译器会发现toString(),从方法java.lang.Object,所以它会知道该方法调用是有效的-但在执行中 Dog会因为对象的运行时类型的使用。
toString()
java.lang.Object