1. 程式人生 > >java多型詳解(介面指向實現類)

java多型詳解(介面指向實現類)

為什麼要用介面引用指向實現類的物件

這種寫法其實Java多型的表現形式

  1. 多型的定義指允許不同類的物件對同一訊息做出響應。即同一訊息可以根據傳送物件的不同而採用多種不同的行為方式。(傳送訊息就是函式呼叫)

List list;是在棧區開闢一個空間放list引用,並沒有建立物件所以不知道ArrayList還是LinkedList當你list= new ArrayList(); 就建立了ArrayList物件。並且把開始建立的list引用指向這個物件ArrayList和LinkedList都是List的實現類。

為什麼一般都使用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()呢? 

問題就在於List有多個實現類,如 LinkedList或者Vector等等,現在你用的是ArrayList,也許哪一天你需要換成其它的實現類呢?,這時你只要改變這一行就行了:List list = new LinkedList(); 其它使用了list地方的程式碼根本不需要改動。假設你開始用 ArrayList alist = new ArrayList(), 這下你有的改了,特別是如果你使用了 ArrayList特有的方法和屬性。 ,如果沒有特別需求的話,最好使用List list = new LinkedList(); ,便於程式程式碼的重構. 這就是面向介面程式設計的好處

注意事項

list只能使用ArrayList中已經實現了的List介面中的方法,ArrayList中那些自己的、沒有在List介面定義的方法是不可以被訪問到的

list.add()其實是List介面的方法

但是呼叫ArrayList的方法如 clone()方法是呼叫不到的


介面的靈活性就在於“規定一個類必須做什麼,而不管你如何做”。我們可以定義一個介面型別的引用變數來引用實現介面的類的例項,當這個引用呼叫方法時,它會根據實際引用的類的例項來判斷具體呼叫哪個方法,這和上述的超類物件引用訪問子類物件的機制相似。

  1. //定義介面InterA
  2. interface InterA  
  3. {  
  4.  void fun();  
  5. }  
  6. //實現介面InterA的類B
  7. class B implements InterA  
  8. {  
  9.  publicvoid fun()  
  10.  {  
  11.   System.out.println(“This is B”);  
  12.  }  
  13. }  
  14. //實現介面InterA的類C
  15. class C implements InterA  
  16. {  
  17.  publicvoid fun()  
  18.  {  
  19.   System.out.println(“This is C”);  
  20.  }  
  21. }  
  22. class Test  
  23. {  
  24.  publicstaticvoid main(String[] args)  
  25.  {  
  26.   InterA a;  
  27.   a= new B();  
  28.   a.fun();  
  29.   a = new C();  
  30.   a.fun();  
  31.  }  
  32. }  


    輸出結果為:

    This is B
    This is C


  上例中類B和類C是實現介面InterA的兩個類,分別實現了介面的方法fun(),通過將類B和類C的例項賦給介面引用a,實現了方法在執行時的動態繫結,充分利用了“一個介面,多個方法”,展示了Java的動態多型性。

  需要注意的一點是:Java在利用介面變數呼叫其實現類的物件的方法時,該方法必須已經在介面中被宣告,而且在介面的實現類中該實現方法的型別和引數必須與介面中所定義的精確匹配