class A {
public void talk(){
this.sayIt();
}
private void sayIt(){
System.out.println("class A says...");
}
}
class B extends A {
private void sayIt(){
System.out.println("class B says...");
}
}
Run Code Online (Sandbox Code Playgroud)
测试类,主要方法:
B b = new B();
b.talk()
//output
class A says...
Run Code Online (Sandbox Code Playgroud)
从那以后我无法得到这个:
B类继承自A类,即公共成员,无法查看/继承私有函数.所以在B类中,我们可以调用talk(). //因为它是由父类继承的.
现在,在talk()方法中,调用sayIt(),因为sayIt()是在B类中定义的,
我希望在执行this.sayIt()时调用B.sayIt().
"这个"不是指B级吗?
请解释.
因为您将sayIt()定义为私有,所以B类不能覆盖它.因此,您有两个sayIt()定义,而不仅仅是一个被子类覆盖的定义.
在A类代码的一部分内部,即使B类版本受到保护或公开,它也将始终从A类调用该版本.这是因为A类只知道类A中的版本,因为B类版本不是覆盖,而是一种完全不同的方法,恰好可以共享相同的名称.
在B类代码的一部分内部,它总是从类B调用该版本,因为A类版本被标记为私有.正如其他人所指出的,如果您将定义更改为受保护或公开,它将对B类可见,并且它将执行您想要的操作.
请注意,如果您要使用默认(包)可见性,那么范围规则将变得非常复杂,实际结果将根据哪个子类在同一个包中以及哪些子列在不同的包中而有所不同.