0

我有一个有趣的场景。

public class Base {

    public void hello(){
        this.say();
        System.out.println("hello-Base");
    }

    protected void say(){
        System.out.println("say-Base");
    }
}



public class Derived extends Base {

    public Derived(){
        super.hello();      
    }

    public static void main(String[] args) {
        Derived d = new Derived();      
    }

    public void say(){
        System.out.println("say-Derived");
    }

}

给出的输出是:

say-Derived
hello-Base

我期待当调用 super.hello() 方法时,调用基类的 say() 方法而不是 Derived 类的 say() 方法。

这种逻辑背后的原因是什么?

4

3 回答 3

2

Super.hello() 调用this.say() which(this) 引用当前对象,即派生,因此它调用派生类的say 方法。

于 2012-12-04T09:50:15.263 回答
1

因为this -- 指向 --->实例类型Derived

所以由于覆盖Derived类方法被调用。

于 2012-12-04T09:55:42.633 回答
1

超级你好();从派生构造函数即派生类的对象引发。依次调用 this.say() 即derived.say()。所以这就是输出如此的原因。

于 2012-12-04T09:58:14.223 回答