首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我们不能在子类中重写超类的私有成员?

为什么我们不能在子类中重写超类的私有成员?
EN

Stack Overflow用户
提问于 2020-07-10 00:10:17
回答 2查看 64关注 0票数 0

子类不是继承了超类的所有成员吗?为什么不能覆盖超类的私有成员变量呢?假设子类有自己的私有成员版本,并且能够在Java中覆盖它,这不是很安全吗?

EN

回答 2

Stack Overflow用户

发布于 2020-07-10 01:31:09

在java中,子类不继承私有成员。子类并不知道父类的所有信息

票数 1
EN

Stack Overflow用户

发布于 2020-07-10 00:36:05

您已经从其他信息中获得了一些提示,但这里有一个示例。假设有两个类,Foo和Bar。Bar继承自Foo。下面是每种方法的简单实现:

代码语言:javascript
复制
public class Foo {
    private void myPrivateMethod() { System.out.printf("myPrivateMethod()\n"); }
    public void myPublicMethod() { System.out.printf("myPublicMethod()\n"); }
}

public class Bar extends Foo {
    public void barPublicMethod() {
        System.out.printf("This is barPublicMethod()!\n");

        myPublicMethod();
        myPrivateMethod();
    }

    public static void main(String[] args) {
        System.out.printf("This is main!\n");

        Bar bar = new Bar();
        bar.barPublicMethod();
    }
}

如果你试图编译这段代码,你会得到这个错误:

代码语言:javascript
复制
$ javac Foo.java Bar.java && java Bar
Bar.java:6: error: cannot find symbol
        myPrivateMethod();
        ^
  symbol:   method myPrivateMethod()
  location: class Bar
1 error

如果删除对myPrivateMethod()的调用,它将正常工作。这就是私有方法的本质。

Bar对Foo的私有方法一无所知。没什么。这意味着你不能覆盖它们,因为Bar甚至不知道它们的存在。这就是私密的意思。

Bar不能对Foo中的私有方法做任何事情。没什么。如果您希望Bar能够覆盖它们,则需要将Foo中的定义更改为protected或public。

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

https://stackoverflow.com/questions/62819136

复制
相关文章

相似问题

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