[英]Private member of parent class is used as a public member function's parameter
[英]Child class private member called from Parent class public member
下面的代码中发生了什么? 请解释输出:
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@7960847b
parent fun
Parent@3b192d32
parent fun
Child@16f65612
parent fun
为什么这行this.fun()没有给出编译时错误?
我认为fun是Child类的私有成员,因此不能从Child类之外(从其Parent类的公共成员)访问。
为什么this.fun()会调用fun()的父类版本? 请注意, 这是指子类对象。
私有成员不会被继承。
我认为这可能是您在这里缺少的重点。 这意味着Child.fun
不会覆盖Parent.fun
。 它们只是两个彼此无关的简单老方法。
当您调用accessFun
,控件始终进入Parent
以下代码:
public void accessFun(){
System.out.println(this);
this.fun(); <---- here
}
现在,由于我们现在位于Parent
,因此可以访问fun
。 并且由于Parent.fun
没有被覆盖 ,因此它将调用Parent.fun
而不是Child.fun
。
我认为乐趣是孩子班级的私人成员,因此不能从班级外部访问(甚至可以从其父班级的公共成员那里访问)。
那是一个完全的误解。 如果不能从类外部访问私有成员,甚至不能通过公共方法访问私有成员,那么它们的作用将大大减少。 为什么还要放在首位呢?
“私有成员只能由在同一类中声明的成员访问”可能要记住。
Parent中的private fun()
由同一Parent类的public accessFun()
调用。 在Test类的main()
中调用public accessFun()
。
这里的accessFun()是公共的,因此可以从任何地方调用它。
例如,就像Pojo类一样,私有成员可以通过公共设置者和获取者来访问
父级中的fun方法是私有的,子级fun()方法不会覆盖父级fun()方法。 但是accessFun方法是公共的,因此可以从子类中调用它,并且可以公共访问。
因此,当您调用accessFun()方法时,它将调用父类fun()方法。 不是子类的fun()方法,因为它是私有的。 这就是为什么您不会收到错误的原因。
我认为乐趣是孩子班级的私人成员,因此不能从班级外部访问(甚至可以从其父班级的公共成员那里访问)。
有时,一切都来自“外部”。 例如, main
呼叫来自外部。
如果无法从外部访问私有成员,则它将始终是无效代码,这没有任何意义。
区别在于对直接访问和间接访问的理解。
在所有情况下,都可以通过accessFun()
方法非直接地调用该方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.