1. 程式人生 > >java中多型以及python動態語言

java中多型以及python動態語言

java中的多型 1、什麼是多型 java引用變數有兩個型別,一個是編譯時的型別,一個是執行時的型別,編譯時的型別由宣告該變數時使用的型別決定,執行時的編譯型別由實際賦給該變數的物件決定。如果編譯時型別和執行時型別不一致,就會出現多型。(通過一個父類能夠引用不同的子類) 2、如何實現多型 java中實現多型有三個必要條件:繼承、重寫、向上型

繼承:在多型中必須存在有繼承關係的子類和父類。

重寫:子類對父類中某些方法進行重新定義,在呼叫這些方法時就會呼叫子類的方法。

向上轉型:在多型中需要將子類的引用賦給父類物件,只有這樣該引用才能夠具備技能呼叫父類的方法和子類的方法。當子類重寫父類的方法被呼叫時,只有物件繼承鏈中的最末端的方法才會被呼叫。

但是向上轉型存在一些缺憾,那就是它必定會導致一些方法和屬性的丟失,而導致我們不能夠獲取它們。所以父類型別的引用可以呼叫父類中定義的所有屬性和方法,對於只存在與子類中的方法和屬性它就望塵莫及了。

指向子類的父類引用由於向上轉型了,它只能訪問父類中擁有的方法和屬性,而對於子類中存在而父類中不存在的方法,該引用是不能使用的,哪怕是過載(方法名相同,但引數不同)該方法。若子類重寫了父類中的某些方法,在呼叫該些方法的時候,必定是使用子類中定義的這些方法(動態連線、動態呼叫)。

  1. publicclass Wine {  
  2.     publicvoid fun1(){  
  3.         System.out.println("Wine 的Fun....."
    );  
  4.         fun2();  
  5.     }  
  6.     publicvoid fun2(){  
  7.         System.out.println("Wine 的Fun2...");  
  8.     }  
  9. }  
  10. publicclass JNC extends Wine{  
  11.     publicvoid fun1(String a){  
  12.         System.out.println("JNC 的 Fun1...");  
  13.         fun2();  
  14.     }  
  15.     publicvoid fun2(){  
  16.         System.out.println("JNC 的Fun2..."
    );  
  17.     }  
  18. }  
  19. publicclass Test {  
  20.     publicstaticvoid main(String[] args) {  
  21.         Wine a = new JNC();  
  22.         a.fun1();  
  23.     }  
  24. }  
  25. -------------------------------------------------  
  26. Output:  
  27. Wine 的Fun.....  
  28. JNC 的Fun2...  
3、多型的好處 1.應用程式不必為每一個派生類編寫功能呼叫,只需要對抽象基類進行處理即可。大大提高程式的可複用性。(即繼承,將派生類的公共功能、屬性寫入基類)
2.派生類的功能可以被基類的方法或引用變數所呼叫,這叫向後相容,可以提高可擴充性和可維護性。(例如,方法傳入的引數用基類表示,這樣就不用為每個不同引數的相同發放重複寫多次)
好處就是可以解耦合,比如你需要一個List類,你可以這樣例項化ArrayList list = new ArrayList(); 也可以List list = new ArrayList();
那麼現在的問題來了 現在的需求是ArrayList已經無法滿足你的要求了,你需要換成LinkedList,如果按照第一種寫法那麼你需要做的工作可能比較多了,除了修改list的型別,還要考慮的是你換成LinkedList的時候,你之前用ArrayList所呼叫的方法LinkedList是沒有的,這倒也及加多了你的工作量。
如果你按第二種方式來實現,那麼你只需將List list = new LinkedList()即可,你無須在擔心之前所呼叫的方法
。 當然現在更好的做法,是把List list;通過spring來修改的,這樣的話就完全不需要改變程式碼了,也就符合設計原則的幾大思想了。 4、python中的多型性

多型即多種形態,在執行時確定其狀態,在編譯階段無法確定其型別,這就是多型。Python中的多型和Java以及C++中的多型有點不同,Python中的變數是弱型別的,在定義時不用指明其型別,它會根據需要在執行時確定變數的型別(個人覺得這也是多型的一種體現),並且Python本身是一種解釋性語言,不進行預編譯,因此它就只在執行時確定其狀態,故也有人說Python是一種多型語言。在Python中很多地方都可以體現多型的特性,比如內建函式len(object),len函式不僅可以計算字串的長度,還可以計算列表、元組等物件中的資料個數,這裡在執行時通過引數型別確定其具體的計算過程,正是多型的一種體現。有些朋友提出Python不支援多型,我是完全不贊同的.

Python以它這種獨有的方式體現多型的根本原因我覺得有兩點:1)Python是解釋性語言;2)Python中變數是弱型別的。所以Python體現多型的方式和Java決然不同,但是不能因為同Java中體現多型的方式不同就認為Python不支援多型,這種想法過於片面。