父類的引用變量指向子類變量時,子類對象向父類對象向上轉換。從子類向父類的轉換不須要什麼限制,只需直接蔣子類實例賦值給父類變量便可,這也是Java中多態的實現機制。spa
在父類變量調用子類特有的、不是從父類繼承來的方法和變量時,須要父類變量向子類轉換。對象
在繼承關係中,有一些方法是不適合由父類定義並由子類繼承並重寫的,有些方法是子類特有的,不該該經過繼承獲得,且子類可能也會有本身特有的成員變量,那麼在使用多態機制的時候,若咱們要經過父類型變量使用到這些子類特有的方法和屬性的話,就須要將服類型變量轉換成對應的子類型變量。一個典型例子即是標準庫中的數據類型包裝類:Integer類,Double類,Long類等,它們都繼承自Number類,且它們都有一個方法叫作compareTo用於比較兩個一樣的類型。然而這個方法是這些子類經過實現Comparable接口來實現的,在Number類中並無該方法的實現,所以若要經過Number類型變量來使用compareTo方法,就要先將Number類轉換成子類的對象。繼承
父類變量向子類轉換必須經過顯式強制類型轉換,採起和向上轉換相同的直接賦值方式是不行的;而且,當把一個父類型變量實例轉換爲子類型變量時,必須確保該父類變量是子類的一個實例,從繼承鏈的角度來理解這些緣由:子類必定是父類的一個實例,然而父類卻不必定是子類的實例。在進行父類向子類的轉換時,一個好的習慣是經過instanceof運算符來判斷父類變量是不是該子類的一個實例,不然在運行時會拋出運行異常ClassCastException,表示類轉換異常。接口