关于多态:Java:使函数不是虚拟的 – 在父引用上调用父方法

Java: make a function not virtual - call parent method on parent reference

本问题已经有最佳答案,请猛点这里访问。

我想这个问题以前就有人问过,但没能立即找到答案。

比如说,某个Pet引用被分配一个Dog对象:

1
Pet pet = new Dog();

如果我写

1
pet.attackInvader();

子类(EDCOX1×1)的方法是通过Java中的所有函数都是虚拟的来调用的。

是否可以调用PetattackInvader()

(我知道我可以编辑Dog的方法来调用super,但在这种情况下,假设我不能更改Dog的实现。)


如果不重写Dog中的方法,也不将实例化对象从Dog更改为Pet中的方法,则不可能实现多态性:在运行时调用的方法始终是运行时对象的方法。现在作为替代方案,您可以在Dog中提供一个方法,将其转换为Pet实例:

1
2
3
  public Pet toPet(){
      return new Pet(...);
 }

然后调用attackInvader()

1
myDog.toPet().attackInvader();

或者通过在Dog中创建一种提供这种特定行为的新方法:

1
2
3
  public void attackInvaderPet(){
      super.attackInvader();
  }