首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用java中的upcasting调用“重写”私有方法

使用java中的upcasting调用“重写”私有方法
EN

Stack Overflow用户
提问于 2016-06-14 10:14:37
回答 1查看 502关注 0票数 1
代码语言:javascript
复制
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()不能被高估吗?但是从PrivateOverride继承的d()应该属于DerivedWithOutD,为什么d()调用私有的f()?为什么DerivedWithD类似乎要进行覆盖,并且可以调用public f()?另外,当我将PrivateOverride的f()改为public时,所有的输出都是从f()派生出来的,这让我现在很困惑!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-14 10:21:27

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

当您调用方法d()时,如果d()未被子类覆盖,则执行的方法是PrivateOverrided()。当该方法调用f()时,它会看到在PrivateOverride中定义的私有f()方法。因为该方法没有被重写(因为它不能),所以它调用该方法,而不是调用子类的f()方法。

如果重写d(),则执行子类DerivedWithDd()方法。当该方法调用f()时,它调用DerivedWithDf()方法。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37809153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档