java-Java 谜题中关键字 super 的工作原理
How the key word super works in java-Java Puzzle
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
关键字如何发挥调用子 class 而不是父 class 的方法的作用。
因为 class B 中的方法 m0
是私有的,所以它不会被 class D 覆盖。
所以 super 关键字确保被调用的测试函数的版本来自 super class (具体来说 B.test() 而不是回溯调用 D.test() ).
但这并不能准确回答您的问题。
第二项是 D1 而不是 B0 的原因是 D.m1() 多态性地覆盖了 B.m1()。
第一项是 B0 而不是 D0 的原因是 D.m0() 不会覆盖 B.m0() 因为 b.m0 是私有的。
方法m0在classB中是private的。所以在继承时,m0方法是私有的,在classD中不被继承。所以,classB的方法m0是执行并打印 "BO"。
但是执行this.m1()时,被classD中的m1方法重写了,所以打印"D1"
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
关键字如何发挥调用子 class 而不是父 class 的方法的作用。
因为 class B 中的方法 m0
是私有的,所以它不会被 class D 覆盖。
所以 super 关键字确保被调用的测试函数的版本来自 super class (具体来说 B.test() 而不是回溯调用 D.test() ).
但这并不能准确回答您的问题。
第二项是 D1 而不是 B0 的原因是 D.m1() 多态性地覆盖了 B.m1()。
第一项是 B0 而不是 D0 的原因是 D.m0() 不会覆盖 B.m0() 因为 b.m0 是私有的。
方法m0在classB中是private的。所以在继承时,m0方法是私有的,在classD中不被继承。所以,classB的方法m0是执行并打印 "BO"。
但是执行this.m1()时,被classD中的m1方法重写了,所以打印"D1"