今日考點圍繞 instanceof 操作符對字面量、對象、基本類型、null 的判斷行為,考察 Java 類型系統、自動裝箱、多態基礎。
package Oct2016;
import java.util.Date;
public class Ques1026 {
public static void main(String[] args) {
boolean b1 = "String" instanceof Object; // 1
boolean b2 = new String() instanceof String; // 2
boolean b3 = 'A' instanceof Character; // 3
boolean b4 = null instanceof String; // 4
boolean b5 = (String)null instanceof String; // 5
boolean b6 = new Date() instanceof String; // 6
}
}
| 表達式 | 結果 | 解析 |
|---|---|---|
"String" instanceof Object | true | 字符串字面量是 java.lang.String 對象,String 繼承 Object。 |
new String() instanceof String | true | 新創建的 String 對象顯然是 String 實例。 |
'A' instanceof Character | false (編譯錯誤) | 基本類型 char 無法直接用 instanceof。需自動裝箱:Character c = 'A'; c instanceof Character 為 true。JLS 規定 instanceof 左操作數必須是引用類型或 null。 |
null instanceof String | false | null 不是任何類的實例,instanceof 永遠返回 false,不拋 NPE。 |
(String)null instanceof String | false | 強轉後類型為 String,但值仍為 null,同上返回 false。 |
new Date() instanceof String | false | Date 與 String 無繼承關係(同屬 Object 子類),跨分支判斷為 false。 |
if (obj instanceof String) 隱含非空判斷。new Date() instanceof String 編譯報錯(Date 不實現 String 接口,非父子類)。instanceof 子類 為 true,instanceof 父類 也為 true。public class Ques1026Fixed {
public static void main(String[] args) {
boolean b1 = "String" instanceof Object; // true
boolean b2 = new String() instanceof String; // true
boolean b3 = Character.valueOf('A') instanceof Character; // true
boolean b4 = null instanceof String; // false
boolean b5 = (String)null instanceof String; // false
// boolean b6 = new Date() instanceof String; // 編譯錯誤:Incompatible types
Object obj = new Date();
boolean b6 = obj instanceof String; // false (編譯通過,運行 false)
System.out.println(b1 + " " + b2 + " " + b3 + " " + b4 + " " + b5 + " " + b6);
}
}
輸出:true true true false false false
instanceof vs getClass() == XXX.class:前者支持多態(子類實例判斷父類為 true),後者精確匹配類型。instanceof (Java 14+):if (obj instanceof String s) { s.length(); } 自動轉型賦值,簡化代碼。obj instanceof Serializable。