使用java中的upcasting调用“覆盖”私有方法

时间:2016-06-14 10:14:38

标签: java polymorphism override

public class PrivateOverride {
    private void f() {
        System.out.println("PrivateOverride f()");
    }
    public static void main(String[] args) {
        PrivateOverride po = new DerivedWithOutD();
        po.d();// PrivateOverride f()

        PrivateOverride poD = new DerivedWithD();
        poD.d();//Derived f()
    }

    public void d() {
        f();
    }
}

class DerivedWithOutD extends PrivateOverride {
    public void f() {
        System.out.println("Derived f()");
    }
}
class DerivedWithD extends PrivateOverride {
    public void f() {
        System.out.println("Derived f()");
    }

    public void d() {
        f();
    }
}

如上面的代码所示,当DerivedWithOutD没有覆盖方法d()时,它调用f()属于PrivateOverride,那是因为PrivateOverride的方法f()不能被覆盖吗?但是d( )继承自PrivateOverride应该属于DerivedWithOutD,为什么d()调用私有f()?为什么DerivedWithD类似乎做覆盖,并且可以调用public f()?另外,当我将PrivateOverride的f()更改为public时,它全部打印Derived f(),现在让我感到困惑!

1 个答案:

答案 0 :(得分:1)

私有方法无法被子类覆盖。如果子类声明一个方法与父类中的私有方法具有相同的签名,则子类方法不会覆盖超类方法。

当您调用方法d()时,如果子类未覆盖d(),则执行的方法为PrivateOverride' s d()。当该方法调用f()时,它会看到f()中定义的私有PrivateOverride方法。由于该方法未被覆盖(因为它不可能),因此它调用该方法而不是子类的f()方法。

如果重写d(),则会执行子类d()的{​​{1}}方法。当该方法调用DerivedWithD时,它会调用f()的{​​{1}}方法。

如果f()不再是私有的,则子类中的DerivedWithD方法现在会覆盖超类的f()方法,因此会覆盖f()在这两种情况下都会执行子类。