Java多態對象的類型轉換
這裡所說的對象類型轉換,是指存在繼承關係的對象,不是任意類型的對象。當對不存在繼承關係的對象進行強制類型轉換時,java 運行時將拋出 java.lang.ClassCastException 異常。
在繼承鏈中,我們將子類向父類轉換稱為「向上轉型」,將父類向子類轉換稱為「向下轉型」。
很多時候,我們會將變數定義為父類的類型,卻引用子類的對象,這個過程就是向上轉型。程序運行時通過動態綁定來實現對子類方法的調用,也就是多態性。
然而有些時候為了完成某些父類沒有的功能,我們需要將向上轉型後的子類對象再轉成子類,調用子類的方法,這就是向下轉型。
注意:不能直接將父類的對象強制轉換為子類類型,只能將向上轉型後的子類對象再次轉換為子類類型。也就是說,子類對象必須向上轉型後,才能再向下轉型。請看下面的代碼:
public class Demo {
public static void main(String args[]) {
SuperClass superObj = new SuperClass();
SonClass sonObj = new SonClass();
// 下面的代碼運行時會拋出異常,不能將父類對象直接轉換為子類類型
// SonClass sonObj2 = (SonClass)superObj;
// 先向上轉型,再向下轉型
superObj = sonObj;
SonClass sonObj1 = (SonClass)superObj;
}
}
class SuperClass{ }
class SonClass extends SuperClass{ }
複製代碼
將第7行的注釋去掉,運行時會拋出異常,但是編譯可以通過。
因為向下轉型存在風險,所以在接收到父類的一個引用時,請務必使用 instanceof 運算符來判斷該對象是否是你所要的子類,請看下面的代碼:[size=0.9em]
public class Demo {
public static void main(String args[]) {
SuperClass superObj = new SuperClass();
SonClass sonObj = new SonClass();
// superObj 不是 SonClass 類的實例
if(superObj instanceof SonClass){
SonClass sonObj1 = (SonClass)superObj;
}else{
System.out.println("不能轉換");
}
superObj = sonObj;
// superObj 是 SonClass 類的實例
if(superObj instanceof SonClass){
SonClass sonObj2 = (SonClass)superObj;
}else{
System.out.println("不能轉換");
}
}
}
class SuperClass{ }
class SonClass extends SuperClass{ }
複製代碼
運行結果:
不能轉換
總結:對象的類型轉換在程序運行時檢查,向上轉型會自動進行,向下轉型的對象必須是當前引用類型的子類。
※寫好Java代碼的30條經驗總結
※java開發需要知道的一些linux命令
※Java是怎樣運行的,你敢說真的知道?
※Java和php的優劣勢及前景分析
TAG:java學習吧 |
※Swift 類型轉換
※能改變形狀的Aquanaut結合兩種類型水下機器人的特性
※Facebook創建另類AI,可完美轉換音樂類型
※opencv Mat類型和BYTE*指針類型互轉
※Perl 數據類型
※scala學習-泛型、界定、形變、this.type、複合類型、抽象類型
※Staem模擬類型的遊戲,絕對的真人體驗
※VirtualLink新標準讓下一代VR設備使用相同類型的電纜
※Chrome 66 新特性:CSS 類型對象模型,非同步剪貼板 API,AudioWorklet,等
※Google出品的Python代碼靜態類型分析器:Pytype
※Redis 數據類型
※Kotlin技術分享:類型的檢查與轉換
※Nano Letters:中國科學家開發出DNA納米機器人 或能高效靶向殺滅特殊類型的乳腺癌細胞
※戴森新的Pure Cool空氣凈化器多了顯示屏,能顯示污物類型和水平
※Python數據類型、運算符、變數
※Python動態類型簡介
※類型轉換運算符 運算符重載 operator new operator delete
※「Python」Chapter1 變數和簡單數據類型
※Kotlin 基本數據類型
※Hibernate 映射枚舉Enum 類型的屬性