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 是子类中的私有成员,因此无法从类外部访问(甚至可以从其父类的公共成员访问)。
那是完全的误解。如果不能从类的外部访问私有成员,甚至不能通过公共方法访问,那么它们的用处就会小得多。为什么首先要拥有它们?
“私有成员只能由在同一类中声明的成员访问”可能更好记住。
TA贡献1872条经验 获得超3个赞
我认为 fun 是子类中的私有成员,因此无法从类外部访问(甚至可以从其父类的公共成员访问)。
有时一切都来自“外部”。例如,main
呼叫来自外部。
如果不能从外部访问私有成员,则它始终是死代码,这是没有意义的。
区别在于对直接访问和间接访问的理解。
在所有情况下,您都可以通过 method 非直接调用该方法accessFun()
。
TA贡献1821条经验 获得超6个赞
parent 中的 fun 方法是私有的,子 fun() 方法不会覆盖父 fun() 方法。但是 accessFun 方法是公共的,因此它可以从子类中调用并且可以公开访问。
因此,当您调用 accessFun() 方法时,它将调用父类 fun() 方法。不是子类 fun() 方法,因为它是私有的。这就是为什么你不会出错的原因。
添加回答
举报