instanceof 是 Java 的二元運算符,用於運行時判斷對象是否為特定類型(類、接口、子類)的實例,返回 boolean。語法:object instanceof Type。
public class Bill {}
public class PhoneBill extends Bill {}
public class GasBill extends Bill {}
public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
// 處理電話賬單
PhoneBill pb = (PhoneBill) bill; // 需強轉
return pb.getAmount() * 0.9;
}
if (bill instanceof GasBill) {
GasBill gb = (GasBill) bill;
return gb.getAmount() * 0.95;
}
return bill.getAmount();
}
null instanceof Type 永遠返回 false(不拋 NPE)。object 編譯時類型與 Type 無繼承關系(既非父子、非實現),直接編譯錯誤。// Java 16 (JEP 394) 模式匹配 instanceof
if (bill instanceof PhoneBill pb) {
// pb 直接可用,無需強轉,作用域限於 if 塊
return pb.getAmount() * 0.9;
}
// 編譯器自動插入強轉,等價於:
// if (bill instanceof PhoneBill) { PhoneBill pb = (PhoneBill) bill; ... }
class Manager extends Employee {}
public void doSomething(Employee e) {
if (e instanceof Manager) {
Manager m = (Manager) e; // 安全強轉
m.approveBudget();
}
}
// 不好:違反開閉原則,新增類型需修改此方法
public double calculate(Bill bill) {
if (bill instanceof PhoneBill) ...
if (bill instanceof GasBill) ...
if (bill instanceof WaterBill) ... // 修改源碼
}
public interface Bill {
double calculate();
}
public class PhoneBill implements Bill {
public double calculate() { return amount * 0.9; }
}
public class GasBill implements Bill {
public double calculate() { return amount * 0.95; }
}
// 調用端
public double process(Bill bill) {
return bill.calculate(); // 動態分派,新增類型無需修改此處
}
if (element instanceof ConcreteElementA) visitor.visit((ConcreteElementA) element);assertThat(obj).isInstanceOf(ExpectedType.class)。instanceof 高度優化(內聯、類檢查快速路徑),性能開銷極低(納秒級)。Class.isInstance()、MethodHandle 或手工類型標記(int typeId)。if-else instanceof 鏈,考慮訪問者模式、策略模式、類型註冊表。null、無關類型。 instanceof 是類型系統的「安全網」,正確使用能增強健壯性;濫用則暴露設計缺陷。理解其語義邊界與現代語法糖,寫出更優雅的 Java 代碼。