java - 为什么从父类(super class)调用时会调用子类的方法?

标签 java polymorphism overriding

我的代码如下所示:

public abstract class BaseClass{
  public void update() {
      //...
  }

  public void somethingHappenedSoCallUpdate() {
      update();
  }
}

public class ExtendingClass extends BaseClass{
  @Override
  public void update() {
      //...
  }
}

有一个 ExtendingClass 实例,并且在某个时刻调用 somethingHappenedSoCallUpdate() 方法。我希望该方法将调用 BaseClass.update() 但会调用 ExtendingClass.update() 。有人能解释一下为什么吗?

最佳答案

And I expect the method will call BaseClass.update() but ExtendingClass.update() is called. Can someone explain why?

因为这就是 Java 的定义方式。默认情况下,所有非私有(private)方法都是虚拟,这意味着当您有重写的方法时,在实例上调用的方法是该实例重写次数最多的版本( ExtendingClass's,在您的情况下),无论通过哪个类型引用进行方法调用。这是现代 OOP 语言中多态性的基础。

编译时类型引用告诉编译器代码是否有权访问该方法;对象的运行时类型告诉 JVM 要调用哪个方法的重写。

举个简单的例子:

class Base {
    public void method1() {
        System.out.println("Base#method1");
    }
}
class Derived extends Base {
    @Override
    public void method1() {
        System.out.println("Derived#method1");
    }

    public void method2() {
        System.out.println("Derived#method1");
    }
}

// Usage:
Base b = new Derived();
b.method1(); // Calls Derived#method1, the most-overridden version the
             // actual object has
b.method2(); // Fails to compile; Base doesn't define method2, so the
             // code doesn't have access to call it when using a Base
             // reference, even though the object does have the method

关于java - 为什么从父类(super class)调用时会调用子类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39975255/

相关文章:

java - Java 中的多态复制

lua:如何让 getmetatable() 返回 nil?

java - 旋转矩形并以正弦波方式移动它 - 使用graphics2D帮助

java - spring-boot 2.0.6 速度 View 与资源加载器路径属性的问题

java - 获取 Unix 线程转储

java - 递归地改变矩阵中相同的数字

polymorphism - "polymorphic"返回的 Rust 特征的简单组织

c++ - 在 OCaml 中,抽象的代价有多大(即多态函数)

string - 重写 Haskell 中 String/Char 的 show 方法

c# - 在 C# 中覆盖,使两个后续方法成为虚拟