我有一个派生的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();
}
}
代码两次打印Derived :: f(),我希望它先打印Base :: f(),然后打印Derived :: f(),就像在C ++中一样
答案 0 :(得分:5)
在Java中,与C ++不同,实例方法默认情况下是虚拟的。这意味着将在运行时根据对象的实际运行时类调度方法调用(而不是在编译时)。在C ++中,您可以通过关键字virtual
实现此行为。
答案 1 :(得分:2)
您的派生f()方法将覆盖Base f()方法。如果要查看Base方法,请尝试放入super.f();。在Derived f()方法的开头,这将称为超类的f()方法。