---恢复内容开始---
Java多态面试题案例几解题思路
这道题是来自别人,先开始看到题很懵,后来有自己的思路:
1 classA2
3 {4
5 publicString show(D obj){6
7 return ("A and D");8
9 }10
11 publicString show(A obj){12
13 return ("A and A");14
15 }16
17 }18
19 class B extendsA20
21 {22
23 publicString show(B obj){24
25 return ("B and B");26
27 }28
29 publicString show(A obj){30
31 return ("B and A");32
33 }34
35 }36
37 class C extendsB{}38
39 class D extendsB{}40
41 classE42
43 {44
45 public static voidmain(String [] args)46
47 {48
49 A a1 = newA();50
51 A a2 = newB();52
53 B b = newB();54
55 C c = newC();56
57 D d = newD();58
59 System.out.println(a1.show(b)); //①
60
61 System.out.println(a1.show(c)); //②
62
63 System.out.println(a1.show(d)); //③
64
65 System.out.println(a2.show(b)); //④
66
67 System.out.println(a2.show(c)); //⑤
68
69 System.out.println(a2.show(d)); //⑥
70
71 System.out.println(b.show(b)); //⑦
72
73 System.out.println(b.show(c)); //⑧
74
75 System.out.println(b.show(d)); //⑨
76
77 }78
79 }80
81 (三)答案82
83
84
85 ① A and A86
87 ② A and A88
89 ③ A and D90
91 ④ B and A92
93 ⑤ B and A94
95 ⑥ A and D96
97 ⑦ B and B98
99 ⑧ B and B100
101 ⑨ 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)方法