我有一些这样的代码:

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();
}

10-04 11:38