java中继承问题,求高手解释一下!

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 MoreDemo{
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));
System.out.println(a1.show(c));
System.out.println(a1.show(d));
System.out.println(a2.show(b));
System.out.println(a2.show(c));
System.out.println(a2.show(d));
System.out.println(b.show(b));
System.out.println(b.show(c));
System.out.println(b.show(d));

}
}
为什么打印结果是
A and A
A and A
A and D
B and A
B and A
A and D
B and B
B and B
A and D
求解释,谢谢!

有点复杂,就解释一条,其它的你自己思考吧。
System.out.println(a2.show(b)); 结果是“B And A”,为什么不是 “B And B”或“A And A”呢?
已知a2的类型是A,实际对象是B。
那么 a2.show(b) 以根据class A的定义来选择方法,自然是进入show(A)方法。 正好 B 又覆盖了 show(A)方法,所以最终执行的是 B.show(A) 方法。
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-11-04
System.out.println(a1.show(b));

因为 B继承A 执行的是A方法内的 show(A obj) 传入的是B类 但是在运行过程中会转化为A类

System.out.println(a1.show(c));

因为 C继承B B继承A 执行的是A方法内的 show(A obj) 传入的是C类 但是在运行过程中会转化为A类
给你举个例子吧
List a = new ArrayList();
然后我有可以吧 List a 强转为Object类
一下我就不一一介绍 都是这个意思 有继承关系的话 子类可以强转为父类,转化后可以调用父类的方法追问

主要是后6个不好理解啊

追答

CD都继承B 但是CD没有自己的方法 虽然都是new的自己 但是方法确实B类的 B类中多了重载了一个方法 重写了一个A类的方法
System.out.println(a2.show(b));

a2 new的是B 虽然它定义的是A 但是在JVM运行时会变成B B里面有这个方法
System.out.println(a2.show(b)); 第四行的输出是错的吧?应该是B and B啊 怎么会是B and A?

反正你理解继承关系的时候 遵循一点,调用子类的方法 子类没有的找父类,子类父类都有的那是重写,用子类的。参数父子类之间可以转换的

第2个回答  2015-11-04
不用每一行都解释吧, 你就说你哪个比较疑惑吧追问

后6个不懂,前三个好理解

相似回答