首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

【Java 每日一題】20161026:instanceof 類型判斷經典考點解析

     編輯:Java 綜合教學

【Java 每日一題】20161026:instanceof 類型判斷經典考點解析

今日考點圍繞 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 Objecttrue字符串字面量是 java.lang.String 對象,String 繼承 Object。
new String() instanceof Stringtrue新創建的 String 對象顯然是 String 實例。
'A' instanceof Characterfalse (編譯錯誤)基本類型 char 無法直接用 instanceof。需自動裝箱:Character c = 'A'; c instanceof Character 為 true。
JLS 規定 instanceof 左操作數必須是引用類型或 null。
null instanceof Stringfalsenull 不是任何類的實例,instanceof 永遠返回 false,不拋 NPE。
(String)null instanceof Stringfalse強轉後類型為 String,但值仍為 null,同上返回 false。
new Date() instanceof StringfalseDate 與 String 無繼承關係(同屬 Object 子類),跨分支判斷為 false。

核心知識點總結

  1. instanceof 左操作數必須是引用類型:基本類型(int、char、boolean 等)直接使用會編譯報錯,需裝箱為包裝類。
  2. null instanceof 任何類型 = false:不拋異常,這是安全檢查 null 的常用模式:if (obj instanceof String) 隱含非空判斷。
  3. 編譯期類型檢查:若左操作數編譯時類型與右操作數類型無繼承關係(非父子、非實現),直接編譯報錯「Incompatible types」。例:new Date() instanceof String 編譯報錯(Date 不實現 String 接口,非父子類)。
    ⚠️ 上表第 6 行實際編譯不通過,而非運行時 false。
  4. 多態性體現:父類引用指向子類對象,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。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved