本文系統講解三個 Java 基礎卻高頻考點:instanceof 類型判斷、final 多維度語義、基本類型與引用類型的值傳遞本質,並附帶可運行代碼驗證。
ClassCastException。class Person { String name; }
class Student extends Person {}
public class Demo {
public static void main(String[] args) {
Person p = new Person("星星");
System.out.println(p instanceof Person); // true
Student s = new Student();
System.out.println(s instanceof Person); // true(子類實例也是父類實例)
// 安全轉型模式
if (p instanceof Student) {
Student stu = (Student) p; // 不會拋異常
}
}
}
| 修飾目標 | 語義 | 代碼示例 |
|---|---|---|
| 基本類型變量 | 首次賦值後不可更改(常量) | final int MAX = 100; |
| 引用類型變量 | 引用地址不可變,但對象內部狀態可變 | final List<String> list = new ArrayList<>(); list.add("a"); // OK |
| 方法 | 禁止子類重寫(override),可重載 | public final void init() {} |
| 類 | 禁止被繼承(如 String、Integer) | public final class Immutable {} |
public static final double PI = 3.14159; // 全大寫+下劃線
class Yuan {
int r;
final double PI = 3.14; // 實例常量
public Yuan(int r) { this.r = r; }
public void area() { System.out.println("面積:" + r * r * PI); }
}
public class FinalDemo {
public static void main(String[] args) {
final Yuan y = new Yuan(10);
y.r = 20; // 合法:修改對象屬性
y.area(); // 面積:1256.0
// y = new Yuan(5); // 編譯錯誤:引用不可重賦值
}
}
Java 只有值傳遞! 無引用傳遞。
public class ValueTransfer {
public static void main(String[] args) {
// 基本類型:無法交換
int a = 10, b = 20;
swap(a, b);
System.out.println("a=" + a + ", b=" + b); // 10, 20
// 引用類型(數組):可修改內容
int[] arr = {10, 20};
swapArr(arr);
System.out.println("arr[0]=" + arr[0] + ", arr[1]=" + arr[1]); // 20, 10
}
static void swap(int a, int b) {
int t = a; a = b; b = t; // 僅修改局部副本
}
static void swapArr(int[] arr) {
int t = arr[0]; arr[0] = arr[1]; arr[1] = t; // 修改堆上對象
}
}
instanceof:判類型,防轉型拋異常;final:變量不變、方法不改、類不繼、常量大寫;作者:王可利(Star·星星)