多態經典面試題
已知類ABCD,B繼承於A,C和D繼承於B,具體如下
- public class A {
- public void print(A a){
- System.out.println("A and A");
- }
- public void print(D d){
- System.out.println("A and D");
- }
- }
- public class B extends A{
- public void print(B b){
- System.out.println("B and B");
- }
- public void print(A a){
- System.out.println("B and A");
- }
- /*//繼承的
- public void print(D d){
- System.out.println("A and D");
- }*/
- }
- public class C extends B{
- public void print(C c){
- System.out.println("C and C");
- }
- public void print(A a){
- System.out.println("C and A");
- }
- /*//繼承的
- public void print(D d){
- System.out.println("A and D");
- }
- public void print(B b){
- System.out.println("B and B");
- }*/
- }
- public class D extends B{
- public void print(D a){
- System.out.println("D and D");
- }
- public void print(A a){
- System.out.println("D and A");
- }
- /*//繼承的
- public void print(B b){
- System.out.println("B and B");
- }*/
- }
- public class Main {
- 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();
- a1.print(b);//A and A
- a1.print(c);//A and A
- a1.print(d);//A and D
- a2.print(c);//B and A
- a2.print(c);//B and A
- a2.print(d);//A and D
- b.print(b);//B and B
- b.print(c);//B and B
- b.print(d);//A and D
- d.print(b);//B and B
- d.print(c);//B and B
- d.print(d);//D and D
- }
- }
針對這個題目,絕大多數人的解題思路是這樣的,搞一個優先級:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)
除了上面這個思路,其實我們同樣可以從繼承和多態的本質出發,進行解析:
1,子類繼承父類,則默認繼承父類的非私有方法,如上述代碼,註釋裏面是隱式繼承的部分;
2,C\D繼承於B,B繼承於A,則C的對象默認不僅屬於C類,也屬於B類,也屬於A類,即,狗不僅屬於犬類,也同樣屬於動物類;
3,子類繼承父類, 可以覆寫父類的方法;
依據以上三點,可以輕鬆解題:
比如:
- a2.print(c)
與此同時,a2引用的是B類型的實例化,被父類定義,實際執行時,A中的print(A a)會在B類中被覆寫(這裏就是多態),即實際執行的是B中的print(A a),得到“B and A”;
例2:
- b.print(d);//A and D
其他題目,以照這種方法分析,就能得到相應的答案。