1.向上轉換
父類的引用變量指向子類變量時,子類對象向父類對象向上轉換。從子類向父類的轉換不需要什么限制,只需直接蔣子類實例賦值給父類變量即可,這也是Java中多態的實現機制。
2.向下轉換
在父類變量調用子類特有的、不是從父類繼承來的方法和變量時,需要父類變量向子類轉換。
為什么要向下轉換?
在繼承關系中,有一些方法是不適合由父類定義并由子類繼承并重寫的,有些方法是子類特有的,不應該通過繼承得到,且子類可能也會有自己特有的成員變量,那么在使用多態機制的時候,若我們要通過父類型變量使用到這些子類特有的方法和屬性的話,就需要將服類型變量轉換成對應的子類型變量。一個典型例子便是標準庫中的數據類型包裝類:Integer類,Double類,Long類等,它們都繼承自Number類,且它們都有一個方法叫做compareTo用于比較兩個同樣的類型。然而這個方法是這些子類通過實現Comparable接口來實現的,在Number類中并沒有該方法的實現,因此若要通過Number類型變量來使用compareTo方法,就要先將Number類轉換成子類的對象。
注意
父類變量向子類轉換必須通過顯式強制類型轉換,采取和向上轉換相同的直接賦值方式是不行的;并且,當把一個父類型變量實例轉換為子類型變量時,必須確保該父類變量是子類的一個實例,從繼承鏈的角度來理解這些原因:子類一定是父類的一個實例,然而父類卻不一定是子類的實例。在進行父類向子類的轉換時,一個好的習慣是通過instanceof運算符來判斷父類變量是否是該子類的一個實例,否則在運行時會拋出運行異常ClassCastException,表示類轉換異常。