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

Java instanceof 關鍵字兩大用法實戰詳解

     編輯:Java 相關知識

基本語法回顧

obj instanceof Type:判斷 obj 所引用對象是否為 Type(類、接口、父類、泛型原始類型)的實例。null 檢查永遠返回 false。

用法一:繼承體系中的多層級類型判斷


interface IObject {}
class Foo implements IObject {}
class Test extends Foo {}

public class Demo {
    public static void main(String[] args) {
        IObject obj = new Test();
        System.out.println(obj instanceof Object);   // true
        System.out.println(obj instanceof Foo);      // true
        System.out.println(obj instanceof Test);     // true
        System.out.println(obj instanceof IObject);  // true
    }
}

結論:實例同時屬於其類、所有父類、實現的所有接口及 Object。可用於安全向下轉型前檢查。

用法二:數組類型檢查


String[] arr = new String[5];
System.out.println(arr instanceof String[]); // true
System.out.println(arr instanceof Object[]); // true(數組協變)
System.out.println(arr instanceof Cloneable); // true(數組實現 Cloneable/Serializable)

注意:基本類型數組(如 int[])僅是 Object、Cloneable、Serializable 的實例,不是 Object[] 的實例。

進階:模式匹配 instanceof (Java 14+)


Object obj = "Hello";
if (obj instanceof String s) {
    // s 直接可用,無需轉型
    System.out.println(s.length());
}

編譯器自動完成「判斷+轉型+賦值」,減少樣板代碼,提升可讀性與作用域安全性。

常見陷阱

  • 編譯期不可達:"abc" instanceof Integer 編譯報錯(類型層級無關)。
  • 泛型擦除:list instanceof List<String> 非法,只能寫 list instanceof List。
  • 性能:現代 JVM 對 instanceof 高度優化,通常不成為瓶頸;但熱點循環中大量使用仍建議優先多態設計。

總結

instanceof 核心價值在於運行時類型識別。掌握其在繼承鏈、接口、數組、泛型擦除、模式匹配中的行為細節,能寫出更安全、更現代的 Java 代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved