多態經典面試題解析

多態經典面試題

已知類ABCD,B繼承於A,C和D繼承於B,具體如下

[html] view plain copy
  1. public class A {  
  2.     public void print(A a){  
  3.         System.out.println("A and A");  
  4.     }  
  5.       
  6.     public void print(D d){  
  7.         System.out.println("A and D");  
  8.     }  
  9. }  

[html] view plain copy
  1. public class B extends A{  
  2.     public void print(B b){  
  3.         System.out.println("B and B");  
  4.     }  
  5.       
  6.     public void print(A a){  
  7.         System.out.println("B and A");  
  8.     }  
  9.       
  10.     /*//繼承的  
  11.       
  12.     public void print(D d){  
  13.         System.out.println("A and D");  
  14.     }*/  
  15. }  
[html] view plain copy
  1. public class C extends B{  
  2.     public void print(C c){  
  3.         System.out.println("C and C");  
  4.     }  
  5.       
  6.     public void print(A a){  
  7.         System.out.println("C and A");  
  8.     }  
  9.       
  10.       
  11.     /*//繼承的  
  12.     public void print(D d){  
  13.         System.out.println("A and D");  
  14.     }  
  15.       
  16.     public void print(B b){  
  17.         System.out.println("B and B");  
  18.     }*/  
  19. }  

[html] view plain copy
  1. public class D extends B{  
  2.     public void print(D a){  
  3.         System.out.println("D and D");  
  4.     }  
  5.       
  6.     public void print(A a){  
  7.         System.out.println("D and A");  
  8.     }  
  9.       
  10.     /*//繼承的  
  11.           
  12.     public void print(B b){  
  13.         System.out.println("B and B");  
  14.     }*/  
  15. }  
題目如下:

[html] view plain copy
  1. public class Main {  
  2.     public static void main(String[] args) {  
  3.         A a1 = new A();  
  4.         A a2 = new B();  
  5.           
  6.         B b = new B();  
  7.         C c = new C();  
  8.         D d = new D();  
  9.           
  10.         a1.print(b);//A and A  
  11.         a1.print(c);//A and A  
  12.         a1.print(d);//A and D  
  13.           
  14.         a2.print(c);//B and A  
  15.         a2.print(c);//B and A  
  16.         a2.print(d);//A and D  
  17.           
  18.         b.print(b);//B and B  
  19.         b.print(c);//B and B  
  20.         b.print(d);//A and D  
  21.           
  22.         d.print(b);//B and B  
  23.         d.print(c);//B and B  
  24.         d.print(d);//D and D  
  25.     }  
  26. }  
結果已經備註在上面

針對這個題目,絕大多數人的解題思路是這樣的,搞一個優先級: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,子類繼承父類, 可以覆寫父類的方法;
依據以上三點,可以輕鬆解題:

比如:

[html] view plain copy
  1. a2.print(c)  
a2是A類型的對象,程序執行時會優先到A類裏面去找print方法,同時c屬於C類型,同樣c也是B類,也是A類。則找到A的print(A a)方法

與此同時,a2引用的是B類型的實例化,被父類定義,實際執行時,A中的print(A a)會在B類中被覆寫(這裏就是多態),即實際執行的是B中的print(A a),得到“B and A”;

例2:

[html] view plain copy
  1. b.print(d);//A and D  
b是B類型的對象,所以在B類中找print(D d)方法,結果發現了從A類中繼承過來的print(D d)方法,直接調用,得到“A and D”

其他題目,以照這種方法分析,就能得到相應的答案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章