1. 程式人生 > 其它 >instanceof 和 型別轉換

instanceof 和 型別轉換

作用:用來測試一個物件是否為一個類的例項

  • boolean result = obj instanceof Class

​ 其中 obj 為一個物件,Class 表示一個類或者一個介面,當 obj 為 Class 的物件,或者是其直接或間接子類,或者是其介面的實現類,結果result 都返回 true,否則返回false。

  注意:編譯器會檢查 obj 是否能轉換成右邊的class型別,如果不能轉換則直接報錯,如果不能確定型別,則通過編譯,具體看執行時定。

 我們新建一個父類 Person.class,然後在建立它的一個子類 Man.class

public class Person {}

  Man.class

public class Man extends Person{  }

  測試:

Person p1 = new Person(); 
Person p2 = new Man();
Man m1 = new Man();
System.out.println(p1 instanceof  Man); //false
System.out.println(p2 instanceof Man); //true
System.out.println(m1 instanceof Man);  //true

  注意第一種情況, p1 instanceof Man ,Man 是 Person 的子類,Person 不是 Man 的子類,所以返回結果為 false。






型別轉換:

//子類轉換為父類,可能會丟失自己本來的一些方法
Student studnet = new Studnet;

    1、父類引用指向子類物件
    2、把子類轉換為父類,向上轉型,不用強制轉換
    3、把父類轉換為子類,向下轉型;  強制轉換  丟失一些方法
    4、方便方法的呼叫,減少重複的程式碼。

​     當對不存在繼承關係的物件進行強制型別轉換時,java 執行時將丟擲 java.lang.ClassCastException 異常。

​     在繼承鏈中,我們將子類向父類轉換稱為“向上轉型”,將父類向子類轉換稱為“向下轉型”。

​      很多時候,我們會將變數定義為父類的型別,卻引用子類的物件,這個過程就是向上轉型。程式執行時通過動態繫結來實現對子類方法的呼叫,也就是多型性。

​      然而有些時候為了完成某些父類沒有的功能,我們需要將向上轉型後的子類物件再轉成子類,呼叫子類的方法,這就是向下轉型。

​      注意:不能直接將父類的物件強制轉換為子類型別,只能將向上轉型後的子類物件再次轉換為子類型別。也就是說,子類物件必須向上轉型後,才能再向下轉型。請看下面的程式碼:

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行的註釋去掉,執行時會丟擲異常,但是編譯可以通過。

    因為向下轉型存在風險,所以在接收到父類的一個引用時,請務必使用 instanceof 運算子來判斷該物件是否是你所要的子類,請看下面的程式碼:

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{ }

執行結果:
    ①不能轉換