---恢复内容开始---
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{} class E { 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
思路:
解题口诀:
成员变量:编译看左,运行看左(因为无法重写);
成员方法:编译看左,运行看右(因为普通成员方法可以重写,变量不可以);
静态方法:编译看左,运行看左(因为属于类);
第一个:在A类中找show(B),然而没有B类对象作为参数方法,就找B的上个类,就 找到A类中有一个show(A)方法,所以是AA
第二个:在A类中找show(C),然而没有C类对象作为参数方法,但是A类 为C 的父类的父类,所以打印AA
第三个:因为其中有D类对象作为参数的方法,所以输出AD
第四个:父类引用指向子类对象,首先调用的是 对象的方法 也就是B类中的,又因为B类中
向上转型,它只能访问父类中拥有的方法和属性,而对于不存在的方法,不能使用,意思就是只能使用重写的方法或者父类的方法。所以是BA;
第五个:虽然 C类继承B类 ,但是只能调用父类中存在的方法,没有以C类对象作为参数的方法,所以只能将C类作为A类,所以也是BA
第六个:因为父类中 直接有D作为参数的方法,所以 AD
第七个:调用B类中以B类对象所谓参数的方法,所以BB
第八个: 因为A B C 类中都没有 以C类对象作为参数的方法,所以C类变为B类,在B类中有 以B类作为参数的方法,(注:如果这点还找不到的话,就会将C类看做A类)并且执行B类的 BA, 为什么不是AA呢 因为覆盖掉了
第九个:以D 对象作为参数的方法 存在,所以执行A类的show(D)方法