public class B {
public B() {
}
private void m0(){
System.out.println("BO");
}
public void m1(){
System.out.println("B1");
}
public void test(){
this.m0();
this.m1();
}
}
public class D extends B{
/**
*
*/
public D() {
}
public void m0(){
System.out.println("DO");
}
public void m1(){
System.out.println("D1");
}
public void test(){
super.test();
}
public static void main(String[] args) {
B d=new D();
d.test();
}
}
我的问题是为什么输出是BO,D1
而不是BO,B1
。我没有得到super
关键字如何扮演调用子类的方法而不是父类的角色。
答案 0 :(得分:8)
因为B类中的方法m0
是私有的,所以D类不会覆盖它。
答案 1 :(得分:1)
所以super关键字确保调用的测试函数的版本来自超类(特别是B.test(),而不是反复调用D.test())。
但这并没有完全回答你的问题。
第二项是D1而不是B0的原因,因为D.m1()多态地覆盖了B.m1()。
第一项是B0而不是D0的原因,因为D.m0()不会覆盖B.m0(),因为b.m0是私有的。
答案 2 :(得分:0)
方法m0在B类中是私有的。因此在继承时,m0方法是私有的,并且不在D类中继承。因此,执行B类的方法m0和" BO"打印出来。
但是当执行this.m1()时,它会被D类中的方法m1覆盖。所以它会打印" D1"