78.對象造型

在講述數據類型的時候,我們已經知道,各種簡單數據類型之間是可以進行相互轉換的,有些轉換可以通過系統自動完成,而有些轉換必須在程序中通過強制轉換來完成。

 

而對於引用類型,也有一個相互轉換的機制。同樣的,在引用類型數據進行轉換的時候,分爲自動造型強制造型兩種情況。


當從子類轉換成父類的時候(或者實現類轉換成接口,下同),造型可以自動完成,比如,Teacher是Person的子類,則如果將一個Teacher對象賦給一個Person類型的變量的時候,造型自動完成。


當從父類轉換成子類的時候(或者接口轉換成實現類),必須使用強制造型,比如,Teacher是Person的子類,如果需要將一個Person對象賦給一個Teacher類型變量的時候,必須使用強制造型。


對象的強制造型可以使用運算符“()”來完成,格式如下:
 SupClass sup = new SubClass();
 SubClass sub = (SubClass)sup;


需要注意的是,無論是自動造型還是強制造型,都只能用在有繼承關係的對象之間

並不是任意的父類類型數據都可以被造型爲子類類型,只有多態情況下,原本就是子類類型的對象被聲明爲父類的類型,纔可以通過造型恢復其“真實面目”,否則會在程序運行時出錯。


在造型的時候,往往需要使用instanceof來判斷一個對象是否可以進行造型,以避免運行時的錯誤(Runtime error)。


比如,Person類有兩個子類:Teacher 和Student,還有一個單獨的類Test,我們來看下面的代碼片斷:
Test t = new Test();
Person p = new Student();

Teacher t = (Teacher)p;//將會出現運行時錯誤
Student s = (Student)t;//因爲Test類和Student之間沒有任何的繼承關係
//所以在編譯的時候就會出錯(編譯錯誤,compile error)


此時,可以先使用instanceof來判斷要造型的對象是否爲可以造型的類型,如:


Person p = new Student();
if(p instanceof Teacher){
 Teacher t = (Teacher)p;
}


這樣就可以避免出現運行時錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章