標籤:
JAVA引用變數有兩個類型:一個是編譯時間類型,一個運行時類型
編譯時間類型由聲明該變數時使用的類型決定,運行時類型由實際賦給該變數的對象決定。如果編譯時間類型和運行時類型不一樣,就形成了多態。
因為子類其實是一個特殊的父類,因為JAVA允許把一個子類對象直接賦給一個父類引用變數,無須任何類型轉換,稱為向上轉型,由系統自動完成。
當把一個子類對象直接賦給父類引用變數後,當運行時調用該引用變數的方法時,其方法行為總是表現出子類方法的行為特徵,而不是父類方法的行為特徵,這就可能出現:相同類型的變數、調用同一個方法時呈現出多種不同的行為特徵,這就是多態
也就是說,當子類對象賦給父類引用變數時候,就發生了多態。在調用的時候,屬性還是直接調用父類的屬性,如果子類重寫了父類的方法,則調用子類的方法,否則繼續調用父類方法,不能調用子類專屬的方法
強制類型轉換
編寫JAVA程式時,引用變數只能調用它編譯時間類型的方法,而不能調用它運行時類型的方法,即使它所引用的對象確實包含該方法。如果需要讓這個引用變數調用它運行時類型的方法,則必須把它強制類型轉換成運行時類型,強制類型轉換需要藉助於類型轉換運算子。
類型轉換運算子是小括弧。
基本類型之間的轉換隻能在數實值型別之間進行,這裡所說的數實值型別包括整數型、字元型、和浮點型。但數實值型別和布爾類型之間不能進行轉換。
參考型別之間的轉換隻能在具有繼承關係的兩個類型之間進行,如果是兩個沒有任何繼承關係的類型,則無法進行類型轉換,否則編譯時間就會出現錯誤。如果視圖把一個父類執行個體轉換成子類執行個體,則這個對象必須實際上是子類執行個體才行,否則會出現ClassCastException異常
使用instanceof運算子可以讓強制類型轉換更安全
instanceof關鍵字
instanceof運算子的前一個運算元通常是一個參考型別變數,後一個運算元通常是一個類(也可以是一個介面),他用於判斷前面的對象是否是後面的類,或者其子類、實作類別的執行個體,如果是,則返回true,否則返回false
**如果子類重寫了父類的方法,那麼父類的建構函式中如果調用了被子類重寫的方法,則會產生null 指標
JAVA筆記整理(六),JAVA中的多態