天天看點

c++ 多态 運作時多态和編譯時多态_面向對象三大特性之多态

Java屬于OOP語言,也就是面向對象的語言,在面向對象語言中有三大特性,也就是封裝、繼承和多态,也有的面向對象語言是四大特性,就是封裝、繼承、多态和抽象。今天就來講一講其中的一大特性,也就是多态。

c++ 多态 運作時多态和編譯時多态_面向對象三大特性之多态

面向對象的Polymorphic,被翻譯為多态,也就是多種狀态,具體的講就是同一個行為具有多個不同表現形式或形态的能力,在Java語言中對應的就是同一個類的同一個方法,會有多種不同的實作方式和計算結果,不過這是有前提條件的。

所謂的前提條件,說的專業一些,就是Java多态的實作機制,就是父類或接口定義的引用變量可以指向子類或實作類的執行個體對象,而程式調用的方法在運作期才動态綁定,就是引用變量所指向的具體實作對象的方法,也就是記憶體裡正在運作的那個對象的方法,而不是引用變量的類型中定義的方法。總結起來就是多态存在的三個必要條件:繼承、重寫和父類引用指向子類對象。繼承就是子類擁有了父類的所有能力,重寫就是子類對父類中的能力有所改造或增強,父類引用指向子類對象就可以利用多态的機制進行方法的調用。

多态在本質上可以分為兩種:編譯時多态和運作時多态,編譯時多态就是在我們編寫好我們的.java檔案後,被編譯器編譯成.class檔案時就已經确定的,也就是我們提前告知了程式在運作期需要調用哪個子類的方法,這種編譯時多态在實際的應用意義不大。還有一種就是運作時多态,就時程式加載位元組碼後在運作時,才确定調用的是哪個子類的方法,通常所說的多态就是指運作時多态。

c++ 多态 運作時多态和編譯時多态_面向對象三大特性之多态

多态存在的三個必要條件說的繼承,也包括實作接口,可就是多态實作的方式有兩種:子類繼承父類(public class Son extends Father),還有就是規定一個接口,類去實作這個接口(public class Bird implements Fly)。還有就是要想使用多态,那麼在聲明對象時要遵循一條法則:聲明的總是父類類型或接口類型。也就是 Father fa = new Son(),或者Fly f = new Bird(),這樣才能使用到多态。在定義方法參數時也應該如此。就像Spring當中@Autowired的使用,可以結合這個自動注入更好的了解多态這一特性。

c++ 多态 運作時多态和編譯時多态_面向對象三大特性之多态

繼續閱讀