多态和继承链

再重温一下

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

发表评论