为了账号安全,请及时绑定邮箱和手机立即绑定

从父类公共成员调用的子类私有成员

从父类公共成员调用的子类私有成员

BIG阳 2021-11-11 15:37:30
下面的代码中发生了什么?请解释输出:class Parent{    private void fun(){        System.out.println("parent fun\n");    }    public void accessFun(){        System.out.println(this);        this.fun();    }}class Child extends Parent{    private void fun(){        System.out.println("child fun");    }}class Test{    public static void main(String[] args) {        Child a = new Child();        Parent b = new Parent();        Parent c = new Child();        a.accessFun();        b.accessFun();        c.accessFun();    }}输出:Child@7960847bparent funParent@3b192d32parent funChild@16f65612parent fun为什么 this.fun() 行没有给出编译时错误?我认为 fun 是 Child 类中的私有成员,因此不能从 Child 类外部(从它的 Parent 类的公共成员)访问。为什么 this.fun() 会调用 fun() 的父类版本?请注意,这是指子类对象。
查看完整描述

3 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

私有成员不会被继承。


我认为这可能是您在这里遗漏的关键点。这意味着Child.fun不会覆盖Parent.fun. 它们只是两个简单的旧方法,彼此无关。


当你调用时accessFun,控制总是进入下面的这段代码Parent:


public void accessFun(){

    System.out.println(this);

    this.fun(); <---- here

}

现在,因为我们现在在里面Parent,我们可以访问fun. 而且,由于Parent.fun是没有被覆盖,它调用Parent.fun而不是Child.fun。


我认为 fun 是子类中的私有成员,因此无法从类外部访问(甚至可以从其父类的公共成员访问)。


那是完全的误解。如果不能从类的外部访问私有成员,甚至不能通过公共方法访问,那么它们的用处就会小得多。为什么首先要拥有它们?


“私有成员只能由在同一类中声明的成员访问”可能更好记住。


查看完整回答
反对 回复 2021-11-11
?
守着一只汪

TA贡献1872条经验 获得超3个赞

我认为 fun 是子类中的私有成员,因此无法从类外部访问(甚至可以从其父类的公共成员访问)。

有时一切都来自“外部”。例如,main呼叫来自外部。

如果不能从外部访问私有成员,则它始终是死代码,这是没有意义的。

区别在于对直接访问和间接访问的理解。

在所有情况下,您都可以通过 method 非直接调用该方法accessFun()


查看完整回答
反对 回复 2021-11-11
?
达令说

TA贡献1821条经验 获得超6个赞

parent 中的 fun 方法是私有的,子 fun() 方法不会覆盖父 fun() 方法。但是 accessFun 方法是公共的,因此它可以从子类中调用并且可以公开访问。

因此,当您调用 accessFun() 方法时,它将调用父类 fun() 方法。不是子类 fun() 方法,因为它是私有的。这就是为什么你不会出错的原因。


查看完整回答
反对 回复 2021-11-11
  • 3 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信