初學java 咱們會聽過一個概念「父類聲明,子類實例化」,其實這就是java對象之間的轉換 。java
對象之間轉換的條件:必須存在繼承關係的對象(不存在繼承關係的對象進行強制轉換會拋出 「 java.lang.ClassCastException」 )spa
轉換的方式有兩種:一、向上轉換,二、向下轉換 對象
一、向上綁定:父類聲明,子類實例化 就是一種 「向上轉換 」的體現 ,程序運行時,經過動態綁定,來完成經過動態綁定來實現對子類方法的調用繼承
二、向下綁定io
有些時候爲了完成某些父類沒有的功能,咱們須要將向上轉型後的子類對象再轉成子類,調用子類的方法,這就是向下轉型。
注意:不能直接將父類的對象強制轉換爲子類類型,只能將向上轉型後的子類對象再次轉換爲子類類型。也就是說,子類對象必須向上轉型後,才能再向下轉型。請看下面的代碼:編譯
- public class Demo {
- public static void main(String args[]) {
- SuperClass superObj = new SuperClass();
- SonClass sonObj = new SonClass();
-
- // 下面的代碼運行時會拋出異常,不能將父類對象直接轉換爲子類類型
- // SonClass sonObj2 = (SonClass)superObj;
-
- // 先向上轉型,再向下轉型
- superObj = sonObj;
- SonClass sonObj1 = (SonClass)superObj;
- }
- }
-
- class SuperClass{ }
- class SonClass extends SuperClass{ }
將第7行的註釋去掉,運行時會拋出異常,可是編譯能夠經過。ast
由於向下轉型存在風險,因此在接收到父類的一個引用時,請務必使用 instanceof 運算符來判斷該對象是不是你所要的子類,請看下面的代碼:class
- public class Demo {
- public static void main(String args[]) {
- SuperClass superObj = new SuperClass();
- SonClass sonObj = new SonClass();
-
- // superObj 不是 SonClass 類的實例
- if(superObj instanceof SonClass){
- SonClass sonObj1 = (SonClass)superObj;
- }else{
- System.out.println("①不能轉換");
- }
-
- superObj = sonObj;
- // superObj 是 SonClass 類的實例
- if(superObj instanceof SonClass){
- SonClass sonObj2 = (SonClass)superObj;
- }else{
- System.out.println("②不能轉換");
- }
- }
- }
-
- class SuperClass{ }
- class SonClass extends SuperClass{ }
運行結果:
①不能轉換
總結:對象的類型轉換在程序運行時檢查,向上轉型會自動進行,向下轉型的對象必須是當前引用類型的子類。引用