面向對象之instanceof

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/Julin1214/article/details/51776146
instanceof是一個簡單的操作運算符。它的前一個操作數通常是一個引用類型的變量,後一個操作數通常是一個類,用於判斷前面的對象是否是後面的類或其子類、實現類的實例。
根據Java語言的規範,使用instanceof運算符有一個限制:instanceof運算符前面操作數的編譯時類型必須是如下3種情況:
    要麼與後面的類相同
    要麼是後面類的父類
    要麼是後面類型的子類
如果前面操作數的編譯時類型與後面的類型沒有任何關係,程序將沒法通過編譯。當使用instanceof運算符的時候,應儘量從編譯、運行兩個階段來考慮它:如果instanceof運算符使用不當,程序編譯時就會拋出異常;當使用instanceof運算符通過編譯後,才能考慮它的運算結果是true,還是false。
一旦instanceof運算符通過了編譯,程序進入運行階段。instanceof運算返回的結果與前一個操作數(引用變量)實際引用的對象的類型有關,如果它實際引用法的對象時第二個操作數的實例,或者是第二個操作數的子類、實現類的實例,instanceof結果返回true,否則返回false
在極端情況下,instanceof前一個操作數所引用對象的實際類型就是後面的類型,但只要它的編譯時類型既不是第二個操作數的類型,也不是第二個操作數的父類、子類,程序就沒法通過編譯。
對於Java的強制轉型而言,可以分爲編譯、運行兩個階段來分析它:
在編譯階段、強制轉型要求被轉型變量的編譯時類型必須是如下3種情況之一:
被轉型變量的編譯時類型與目標類型相同。
被轉型變量的編譯時類型是目標類型的父類;
被轉型變量的編譯時類型是目標類型子類,這種情況下可以自動向上轉型,無需強制轉換。
如果被轉型變量的編譯時類型與目標類型沒有任何繼承關係,編譯器將提示編譯錯誤。通過上面分析可以看出,強制類型的編譯階段只關心引用變量    的編譯時類型,至於該引用變量實際引用對象的類型,編譯器並不關心,也沒法關心。
在運行階段,被轉型變量所引用對象的實際類型必須是目標類型的實例,或者是目標類型的子類,實現類的實例,否則在運行時將引發異常。
instanceof運算符除了可以保證某個引用變量時特定類型的實例外,還可以保證該變量沒有引用一個null.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章