1. 程式人生 > >java中物件型別轉換

java中物件型別轉換

      在java開發中我們經常見到的為了降低程式間的耦合度,在定義某些類是通常使用的都是父型別,之後程式呼叫者就可以根據自己的需求將子型別賦值上去,實現功能上的呼叫,在這過程中就是運用了物件的向上轉型,執行時通過後期繫結來實現對實際子類的呼叫。這樣就實現了傳說中java的多型功能。然而有些時候為了完成某些父類沒有的功能,我們需要將向上轉型後的父類再轉成子類,實現其他的處理,這就是我們的向下轉型。在這裡,一定要切記一點在進行向下轉型前一定要判斷是否型別相同(isAssignFrom或instanceof),否則將丟擲java.lang.ClassCastException的錯誤。
       這時候有人可能會有很多的誤解(我也曾經被弄糊塗了),都說子類繼承了父類,那麼父子類之間具有相同的型別那麼為什麼不能夠直接進行向下轉型呢???  原因在於 子類繼承父類是對父類所提供的服務介面的一個擴充套件,也就是說  父類提供的介面是子類所提供介面的一個子集,所以說單純的父類物件時無法轉型某個子類物件的。
      SuperClass super = new SuperClass;//建立父類物件
      SonClass son = (SonClass)super;  //這樣的操作時完全錯誤的
我們可以再設計一下父類和子類的類結構:
SuperClass{
       public void printA(){System.out.println("Super printA");}
}
SonClass extends SuperClass{
      public void printA(){System.out.println("Son printA")} //對父類的一個覆寫
      public void printB(){System.out.println("Son PrintB")}  //對父類的一個擴充套件介面
}
這個時候我們強制將父類物件向下轉換成子類物件時,父類物件中沒有printB()方法,這樣就會造成混亂,所以在進行向下轉型時一定要先判斷父類的型別。