我的代码如下所示:
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()
butExtendingClass.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/