在父方法中重写方法调用

Overridden method call in parent method

考虑以下因素:

public class Child extends Parent{
  public boolean isMeh(){
    return true;
  }

  public void childMethod() {
    System.out.println("child: "+isMeh());
  }

  public static void main(String... args){
    Child child = new Child();
    child.parentMethod();
    child.childMethod();

  }

}

class Parent{
  public boolean isMeh(){
    return false;
  }

  public void parentMethod() {
    System.out.println("parent: "+isMeh());
  }
}

输出:

parent: true
child: true

很明显,在 Child class 中调用 isMeh() 时,它会调用重写的方法。

但是当在父对象对象的方法中调用被覆盖的方法时,它仍然调用子对象的方法。

我看到我们创建了一个子对象,而 parentMethod 只是继承的,所以当我们调用 isMeh() 时,它会调用可用的(覆盖的)对象。

在 java 中执行此操作的原因是什么?

Parent 的继承层次结构中的任何 class,无论是 ChildParent,还是从它们派生的某些 Grandchild,都有恰好是调用 isMeh 方法的一个实现。当 Child 用自己的实现覆盖 ParentisMeh 时,它会替换实现;就 Child 而言,Parent 中的实施不再适用 *.

当您实例化 Child 并调用其 parentMethod 时,该方法只能访问一个方法 isMeh - 即 Child 提供的实现。这就是为什么你会得到你所描述的行为。

这种行为允许非常好的模式:例如,您可以在父类中编写一个 "partial implementation" 方法,依靠子 class 提供的 "plug-in" 功能覆盖。这种技术被称为 Template Method Design Pattern.

* 虽然 Child 保留了显式调用 ParentisMeh 的能力。