再重温一下
class A {
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
}
class B extends A {
public String show(B obj) {
return ("B and B");
}
public String show(A obj) {
return ("B and A");
}
}
class C extends B {
}
class D extends B {
}
public class Main {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); //1 A and A
System.out.println(a1.show(c)); //2 A and A
System.out.println(a1.show(d)); //3 A and D
System.out.println(a2.show(b)); //4 B and A
System.out.println(a2.show(c)); //5 B and A
System.out.println(a2.show(d)); //6 A and D
System.out.println(b.show(b)); //7 B and B
System.out.println(b.show(c)); //8 B and B
System.out.println(b.show(d)); //9 A and D
}
}
1:A里没有show(B)方法,A没有基类,因此找B的基类A,A里有show(A)方法,因此输出A and A
2:A里没有show(C)方法,A没有基类,因此找C的基类B,A里没有show(B)方法,继续找B的基类A,A里有show(A)方法,因此输出A and A
3:A里没有show(D)方法,因此输出A and D
4:A里没有show(B)方法,A没有基类,因此找B的基类A,A里有show(A)方法,由于a2为指向子类B对象的基类A引用,而且子类B重写了show(A)方法,因此输出B and A
5:A里没有show(C)方法,A没有基类,因此找C的基类B,A里没有show(B)方法,继续找B的基类A,A里有show(A)方法,由于a2为指向子类B对象的基类A引用,而且子类B重写了show(A)方法,因此输出B and A
6:A里有show(D)方法,由于a2位指向子类B对象的基类A引用,而且子类B没有重写show(D)方法,因此输出A and D
7:B里有show(B)方法,因此输出B and B
8:B里没有show(C)方法,因此找B的基类A,A里没有show(C)方法,A没有基类,因此找C的基类B,B里有show(B)方法,就不继续往上找了,因此输出B and B
9:B里没有show(D)方法,因此找B的基类A,A里有show(D)方法,因此输出A and D