1. 程式人生 > >Class型別資訊之型別轉換前檢查

Class型別資訊之型別轉換前檢查

在java型別轉換的時候經常會遇到型別轉換。例如Circle是Shape的子類(Circle extends Shape)。那麼Circle的物件轉換成Shape的物件則是向上轉換。那麼Shape型別向Circle型別轉換則為向下轉換。a, 在java中型別轉換中向上型別轉換是可以被接受的。拿上面的例子中來說,由於編譯器知道Circle肯定是一個Shape,所以編譯器允許自由的做向上型別的賦值操作。所以紅字中即使你把顯示的型別轉換去掉也沒有關係 以下是一個簡單的demo RedToy是Toy的子類。RedToy redToy = new RedToy();System.out.println("redToy is " + redToy);Toy toy = new Toy();System.out.println("toy1 is " + toy);toy = (Toy) redToy; //toy = redToy;System.out.println(
"toy is " + toy);toy.writes();列印日誌如下:
我們可以根據HashCode來看出 當進行向上型別轉換的時候。只是將父類的物件的雜湊碼變成了子類物件的雜湊碼而已。這也是多型的體現。父類物件指向子類物件的地址而向下型別轉換中還是拿Circle和Shape舉例子。你要把Shape變成Circle型別的話,由於編譯期間只會知道Circle物件是一個Shape。而不知道它是Circle還是Square。所以不使用顯式的型別轉換,編譯器就不允許執行向下賦值。Toy toy = new Toy();System.out.println("toy1 is " + toy);redToy = (RedToy) toy;
// errorToy toy1 = new RedToy();System.out.println("toy2 is " + toy1);redToy = (RedToy) toy1;// success在上面兩端程式碼中第一段出現錯誤。第二段是可以執行的。根據列印結果第一個toy指向的是Toy的物件的雜湊碼。第二個toy1 指向的是RedToy物件的雜湊碼。之所以第二個可以成功是因為toy1本身指向的就是RedToy物件所以得出結論: -> 在向下進行型別轉換的時候要麼進行異常的處理 要麼使用instanceof函式判斷是否改類物件指向你所需要轉換的那個物件。 (可以轉型的情況為先把子類轉父類,向下轉型時候確定父類能不能轉回為之前的子類)
Toy toy = new Toy();System.out.println("toy1 is " + toy);if (toy instanceof RedToy) { redToy = (RedToy) toy;}Toy toy1 = new RedToy();System.out.println("toy2 is " + toy1);if (toy1 instanceof RedToy) { redToy = (RedToy) toy1;}所以instanceof和Class物件的isInstance()方法一樣,判斷的是你是這個類嗎?或者你是這個類的派生類不。