1. 程式人生 > >Java 多態

Java 多態

建立 重用 bool 父類 地址 行為 log 指向 bic

  一、多態介紹

  繼承提高了代碼的重用性,讓類和類之間建立的聯系,為多態創造了條件。

  1、什麽是多態

  多態是指序中定義的引用變量所指向的具體類型在編程時並不確定,而是在程序運行期間才確定。

  由於在程序運行時才確定具體的類型,即不修改程序的代碼就可以改變程序運行時所綁定的具體代碼,讓程序選擇多個運行狀態,這就是多態性。

  2、多態的種類(主要指運行期)

  編譯時多態:方法重載,系統在編譯時確定調用重載函數的哪個版本

  運行時多態:基於面向對象的繼承性實現,父類型的引用可以指向子類型的對象,這就是向上轉型。通過一個父類的引用發出的方法調用,執行的方法可能是在父類中的實現,也可能是在子類中的實現,這由運行時刻具體的對象類型決定。

  3、向上轉型

  首先理解,子類是父類的特殊化,每個子類是其父類的實例。

  所以在允許的繼承關系中,可以將子類對象賦值給父類型的引用。

反過來,會導致編譯時錯誤。

並且,通過這個引用訪問子類的對象時,只能訪問父類中擁有的方法和屬性。因為編譯器認為引用是父類中的引用。

/*Bicycle是MountainBike的父類*/
Bicycle myBike=new MountainBike();

/*Object是所有類的父類*/
Object obj=new MountainBike();

  

  4、向下轉型

  即把上轉型中的父類型引用又賦值給一個子類型的引用,指向的仍然是這個子類型的對象。

必須是顯示的,即強制類型轉換。

Object obj=new MountainBike();
MountainBike myBike=(MountainBike) obj;

  這一轉換編譯器會通過,但是如果在運行時obj不是MountainBike類型,會拋出異常。

  所以在這種情況下,為了比賣你運行時異常,我們可以使用instanceof操作符做邏輯測試:

if(obj instanceof MountainBike){
    MountainBike myBike=(MountainBike obj);
}

  在一個深層次的繼承關系中,這種判斷分支是一個噩夢。因而在設計良好的程序中,應該盡量避免這種判斷!

  5、方法重寫(override) 

  (父類子類同名方法的參數個數、類型與順序必須保持一致)

返回類型必須兼容,比如父類中的類型為某個類的對象,子類中的方法可以返回這個類或者它的子類。

  父類的靜態方法不能被子類重寫為非靜態;

  父類的非靜態方法不能被子類重寫為靜態。

  二、多態的實現

  子類繼承父類後,父類型的引用變量既可以指向父類對象,也可以指向子類對象。

  當相同的消息發給一個對象引用時,該引用會根據具體指向子類還是父類對象而執行不同的行為。多態性就是相同的消息使得不同的對象作出不同的響應的機制。

  1、繼承實現多態

  繼承實現多態有三個條件:繼承關系、方法重寫和向上轉型(子類的引用復制父類的對象引用)。

  只有滿足了3個條件,才能在一個繼承結構中使用統一的邏輯代碼處理不同的對象,從而達到執行不同的動作的目的。

  (具體執行父類對象還是子類對象的方法,你看指向的內存是哪個的實例就好了)

  2、關於equals()方法

  操作符“==”可以比較兩個基本類型的變量是否相等。

  當我們使用它比較兩個對象的引用變量,實際上實在比較兩個引用變量是否指向了相同的對象。這裏,相同的對象是指在堆中占用同一塊內存單元中的同類型對象。

  如何比較兩個對象的引用變量所指向的對象的內容是否相同?

  使用equals()方法(Object類中定義了,意味著每個類都會有這個方法),返回boolean。

  但是默認情況下,它比較的是對象的引用是否相同。

  String、Integer、Date中,equals()方法被重寫了,比較的不是內存中的地址而是對象的內容。

  在自定義的類的對象中,equals()比較兩個引用是否指向了同一個對象。因此,如果想比較對象的內容,在類中重寫equals()吧!

  

Java 多態