例子:
答案:
1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D
解析:
原博客说1,2,3非常好理解,但是我还是想不明白,所以把自己的思路完完整整记下来
A a1 = new A();
1. a1.show(b)
在A里面没有关于show(B obj) 的方法,但是B继承了A,所以输出show(A obj) A and A
2. a1.show(c)
与1.同理,A里面没有关于show(C obj)的方法,但是C继承了B,B继承了A,所以输出show(A obj) A and A
3. a1.show(d)
A里面有关于show(D obj)的方法,所以输出show(D obj) A and D
A a2 = new B();
父类引用指向子类对象的时候
4. a2.show(b)
a2的数据类型是 A 但是没有show(B obj)的方法,但是B继承了A,所以调用了show(A obj)
但是父类引用指向了子类对象B ,而B中重写了show(A obj) 的方法,所以输出了B and A而不是B and B
如果子类B没有重写show(A obj)方法,那么就会输出A and A
5.a2.show(c)
与4同理,A里面没有关于show(C obj)的方法,但是C继承了B,B继承了A,所以调用了show(A obj)
但是父类引用指向了子类对象B ,而B中重写了show(A obj) 的方法,所以输出了B and A
6.a2.show(d)
与4同理,A里面有show(D obj)的方法,所以直接输出了A and D
B b = new B();
7.b.show(b)
在B类里面有show(B obj)方法,所以直接输出 B and B
8.b.show(c)
在B类里面没有show(C obj)方法,但C继承了B,所以直接输出 B and B
9.b.show(d)
在B类里面没有show(D obj)方法,但C继承了B,B继承了A,A里面有show(D obj)所以直接输出 A and D