关于多态。。 public 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"); } } public class C extends B{ } public class D extends B{ } public class test {
public static void main(String[] args) { // TODO Auto-generated method stub A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println(a2.show(b)); System.out.println(a2.show(c)); System.out.println(a2.show(d)); }
} 输出结果应该是什么?why?~ ------解决思路---------------------- 运行的结果是:B and A B and A A and D 解释一下: A a2 = new B();这里a2的编译类型是A,运行类型是B。a2.show()方法调用中只能调用声明该变量的类A里面包含的方法,show(D obj)或show(A obj)。show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。所以a2.show(b),a2.show(c)是调用B类里面的show(A obj),a2.show(d)则是调用A类里面的show(D obj) ------解决思路---------------------- B and A B and A A and D 正确 ------解决思路---------------------- 继承结构:B继承A,C和D继承B 执行结果是: B and A B and A A and D 说明: B and A 这个不用说了,直接调用B.show(A); B and A 这个我也没理解,debug运行走的是B.show(A);但是为什么不走B.show(B obj)呢,着实没搞懂; A and D 这个很好理解,走的是B.show(D obj)方法,此方法是从A中继承过来的 ------解决思路----------------------
运行的结果是:B and A B and A A and D 解释一下: A a2 = new B();这里a2的编译类型是A,运行类型是B。a2.show()方法调用中只能调用声明该变量的类A里面包含的方法,show(D obj)或show(A obj)。show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。所以a2.show(b),a2.show(c)是调用B类里面的show(A obj),a2.show(d)则是调用A类里面的show(D obj)
运行的结果是:B and A B and A A and D 解释一下: A a2 = new B();这里a2的编译类型是A,运行类型是B。a2.show()方法调用中只能调用声明该变量的类A里面包含的方法,show(D obj)或show(A obj)。show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。所以a2.show(b),a2.show(c)是调用B类里面的show(A obj),a2.show(d)则是调用A类里面的show(D obj)
你该不会是搞c++的吧? ------解决思路----------------------
运行的结果是:B and A B and A A and D 解释一下: A a2 = new B();这里a2的编译类型是A,运行类型是B。a2.show()方法调用中只能调用声明该变量的类A里面包含的方法,show(D obj)或show(A obj)。show(A obj)在子类B里面被覆盖重写,所以a2调用show(A obj)方法,实际是调用子类B里面的show(A obj)。所以a2.show(b),a2.show(c)是调用B类里面的show(A obj),a2.show(d)则是调用A类里面的show(D obj)
你该不会是搞c++的吧?
java
不是说你 我说的是一楼 ------解决思路---------------------- 实际上这里涉及方法调用的优先问题?,优先级由高到低依次为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。让我们来看看它是怎么工作的。? ??比如,a2.show(b),a2是一个引用变量,类型为A,则this为a2,b是B的一个实例,于是它到类A里面找show(B?obj)方法,没有找到,于是到A的super(超类)找,而A没有超类,因此转到第三优先级this.show((super)O),this仍然是a2,这里O为B,(super)O即(super)B即A,因此它到类A里面找show(A?obj)的方法,类A有这个方法,但是由于a2引用的是类B的一个对象,B覆盖了A的show(A?obj)方法,因此最终锁定到类B的show(A?obj),输出为"B?and?A”。 同理,a2.show(c),c是类C的一个实例,C继承与B,于是到B中找有没有show(C obj)方法,没有找到,又去A中找,A中也没有。所以转到第三优先级this.show((super)O),O为C,(super)O为(super)C即B;即相当于是a2.show(b),又转到上面的过程,即输出结果也是“B and A”; 同理:因为A中存在show(D obj)这个方法,所以输出结果是“A and D" ------解决思路---------------------- 编译报错,a2.show(c)编译时报错,A类中没有show(C obj)的方法,a2在编译时是A类,A类中没有show(C obj)的方法,编译时报错