为什么Java基类构造函数调用派生类的方法?

Uri*_*Raz 0 java inheritance

我有一个派生的Java类重写基类的方法。当基类调用该方法时,它将执行派生类的功能,而不是其自身的功能。为什么?

public class HelloWorld{

    public static void main(String []args){
        Derived d = new Derived();
        System.out.println("Main");
    }
}

class Base {
    void f() {
        System.out.println("Base::f()");
    }

    public Base() {
        f();
    }
}

class Derived extends Base {
    void f() {
        System.out.println("Derived::f()");
    }

    public Derived() {
        f();
    }
}
Run Code Online (Sandbox Code Playgroud)

代码打印两次Derived :: f(),我希望它先打印Base :: f(),再打印Derived :: f(),就像在C ++中那样

Rus*_*lov 5

在Java中,与C ++不同,实例方法默认情况下是虚拟的。这意味着将在运行时根据对象的实际运行时类调度方法调用(而不是在编译时)。在C ++中,可以使用keyword实现此行为virtual