我有一些这样的代码:
abstract class ExampleOne {
int dataOne = 1000;
abstract void display();
}
class ExampleTwo extends ExampleOne {
int dataTwo;
ExampleTwo(int varOne) {
dataTwo = varOne;
}
public void disp() {
System.out.println("Testing");
}
public void display() {
System.out.println(dataOne);
}
}
class Example {
public static void main(String args[]) {
ExampleOne obj = new ExampleTwo(20);
obj.disp();
obj.display();
}
}
编译时,出现错误:
obj.disp();
^
symbol: method disp()
location: variable obj of type ExampleOne
为什么会这样?
我正在将
ExampleTwo
的实例分配给ExampleOne
,为什么Java不选择ExampleOne
实例而不是ExampleTwo
?相同的概念在
dynamic polymorphism
方面起作用!为什么会这样呢?
最佳答案
由于obj
的类型为ExampleOne
,因此编译器将在obj
类中搜索您在ExampleOne
上调用的方法,如果找不到,则会引发错误。
Java为什么不选择ExampleOne实例而不是ExampleTwo?
这是因为编译时检查是根据引用类型而不是实际对象类型进行的。然后根据引用的实际对象确定运行时调用的实际方法。这就是我们所谓的方法调用的动态调度。
您可以在disp()
类中添加抽象的ExampleOne
方法,只是为了确保编译器对调用感到满意。
abstract class ExampleOne{
int dataOne=1000;
abstract void display();
abstract void disp();
}