下面的代码中发生了什么?请解释输出:
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()的父类版本?注意此是指子类对象。
答案 0 :(得分:3)
不继承私有成员。
我认为这可能是您在这里失踪的重点。这意味着Child.fun
不会覆盖Parent.fun
。它们只是两个彼此无关的普通方法。
调用accessFun
时,控制总是进入Parent
中的这段代码:
public void accessFun(){
System.out.println(this);
this.fun(); <---- here
}
现在,由于我们现在位于Parent
内部,因此我们可以访问fun
。并且由于Parent.fun
是未被覆盖的,因此它将调用Parent.fun
而不是Child.fun
。
我认为乐趣是孩子班级的私人成员,因此不能从班级外部访问(甚至可以从其父班级的公共成员那里访问)。
那是一个完全的误解。如果不能从类外部访问私有成员,甚至不能通过公共方法访问私有成员,那么它们的作用将大大减少。为什么还要放在第一位呢?
“只能由在同一类中声明的成员访问私有成员”可能是一个更好的记住方式。
答案 1 :(得分:0)
private fun()
由同一个父类的public accessFun()
调用。 public accessFun()
在Test类的main()
中被调用。
这里的accessFun()是公共的,因此可以从任何地方调用它。
例如,就像Pojo类一样,私有成员可以通过公共设置者和获取者来访问
答案 2 :(得分:0)
父级中的fun方法是私有的,子级fun()方法未覆盖父级fun()方法。但是accessFun方法是公共的,因此可以从子类中调用它,并且可以公共访问。
因此,当您调用accessFun()方法时,它将调用父类fun()方法。不是子类的fun()方法,因为它是私有的。这就是为什么您不会收到错误的原因。
答案 3 :(得分:0)
我认为乐趣是孩子班级的私人成员,因此不能从班级外部访问(甚至可以从其父班级的公共成员那里访问)。
有时候,一切都来自“外部”。例如,main
呼叫来自外部。
如果无法从外部访问私有成员,那么它将始终是无效代码,这是没有道理的。
区别在于对直接访问和间接访问的理解。
在所有情况下,您都直接通过方法accessFun()
间接调用该方法。