Java 語言設計哲學貫穿於這 30 個核心概念中。掌握它們,即掌握了 Java 思維的骨架。本文按邏輯層次重新組織,配合代碼示例與記憶鉤子,助你構建堅不可摧的知識網絡。
instance fields)methods)== 比較標識,equals() 比較狀態Date happyDay = new Date(); // Date 是類,happyDay 是引用變量,new Date() 是對象實例
private 字段 + public getter/setter = 受控訪問。好處:可隨時修改內部實現不影響調用者。
class Student extends Person { // Student is-a Person
// 自動擁有 Person 的非 private 成員
}
所有類隱式繼承 java.lang.Object (根超類)。
Object obj = "Hello"; // 編譯類型 Object,運行類型 String
obj.toString(); // 動態綁定調用 String.toString()
| 關係 | 符號 | 含義 | 代碼體現 |
|---|---|---|---|
| 依賴 | use-a | 臨時使用 | 方法參數、局部變量、靜態方法調用 |
| 聚合 | has-a | 整體-部分,生命周期獨立 | class Car { Engine engine; } |
| 組合 | contains-a | 強聚合,生命周期綁定 | class House { Room room = new Room(); } |
| 繼承 | is-a | 泛化-特化 | class Cat extends Animal |
| 實現 | implements | 契約履行 | class ArrayList implements List |
new 使用| 維度 | 重載 | 覆蓋 |
|---|---|---|
| 發生位置 | 同一類 / 父子類 | 父子類 |
| 方法簽名 | 同名、不同參數列表 | 完全相同 |
| 返回類型 | 可不同 | 必須兼容 (协变返回) |
| 綁定時機 | 編譯期靜態綁定 | 運行期動態綁定 |
java.lang、java.util、javax.sql...package 語句必須在源文件首行import java.util.*; (按需導入具體類更佳)| 修飾符 | 同類 | 同包 | 子類(異包) | 非子類(異包) |
|---|---|---|---|---|
private | ✓ | ✗ | ✗ | ✗ |
default | ✓ | ✓ | ✗ | ✗ |
protected | ✓ | ✓ | ✓ | ✗ |
public | ✓ | ✓ | ✓ | ✓ |
this,只能訪問靜態成員final class:不可繼承 (如 String)final method:不可覆蓋final variable:引用不可變 (基本類型值不可變,引用類型指向不可變)@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyClass that = (MyClass) o;
return Objects.equals(field1, that.field1) && Objects.equals(field2, that.field2);
}
配合 HashMap/HashSet 使用時必須同時重寫。
默認輸出 ClassName@hashCode,極無意義。必須重寫輸出業務關鍵字段。
List list = new ArrayList<>();
list.add("Hello");
// list.add(123); // 編譯報錯
String s = list.get(0); // 無需強轉
Class clazz1 = String.class;
Class> clazz2 = "Hello".getClass();
Class> clazz3 = Class.forName("java.lang.String");
| API | 用途 |
|---|---|
clazz.getFields() | 獲取所有 public 字段 (含繼承) |
clazz.getDeclaredFields() | 獲取本類聲明的所有字段 (含 private) |
clazz.getMethods() | 獲取所有 public 方法 (含繼承) |
clazz.getDeclaredMethods() | 獲取本類聲明的所有方法 |
clazz.getConstructors() | 獲取 public 構造器 |
field.setAccessible(true) | 暴力反射訪問 private 成員 |
default 默認方法、static 靜態方法、private 私有方法// 經典:ActionListener
button.addActionListener(e -> System.out.println("Clicked!"));
// 自定義回調
interface Callback { void onResult(String data); }
void fetchData(Callback cb) { /* ... */ cb.onResult("data"); }
| 類型 | 定義位置 | 訪問外部成員 | 典型用途 |
|---|---|---|---|
| 成員內部類 | 類內部、方法外 | 可訪問所有 (含 private) | 實現邏輯強綁定 |
| 靜態內部類 | 類內部、方法外 + static | 只能訪問靜態成員 | 單例模式、Builder 模式 |
| 局部內部類 | 方法內部 | 可訪問 final/效果上 final 變量 | 封裝一次性邏輯 |
| 匿名內部類 | 表達式中 | 同局部內部類 | 事件監聽、Runnable、比較器 |
interface Service { void serve(); }
class RealService implements Service { public void serve() { System.out.println("Real"); } }
InvocationHandler handler = (proxy, method, args) -> {
System.out.println("Before");
method.invoke(new RealService(), args);
System.out.println("After");
return null;
};
Service proxy = (Service) Proxy.newProxyInstance(
Service.class.getClassLoader(),
new Class[]{Service.class},
handler
);
proxy.serve(); // 輸出 Before → Real → After
Cloneable 標記接口,重寫 clone() 為 public| 分類 | 類型 | 位數 | 默認值 | 包裝類 |
|---|---|---|---|---|
| 整數 | byte | 8 | 0 | Byte |
| short | 16 | 0 | Short | |
| int | 32 | 0 | Integer | |
| long | 64 | 0L | Long | |
| 浮點 | float | 32 | 0.0f | Float |
| double | 64 | 0.0d | Double | |
| 字符 | char | 16 | '\u0000' | Character |
| 布爾 | boolean | 1 (JVM 實現相關) | false | Boolean |
Integer a = 1000, b = 1000;
System.out.println(a == b); // false (超出 -128~127 緩存範圍)
Integer c = 100, d = 100;
System.out.println(c == d); // true (緩存池複用)
對象三要素狀態行為標識,類是模板實例對象。封裝隱藏繼承is-a多態動態綁定。構造器同名無返回配合new,重載同名參數不同覆蓋簽名相同動態綁定。包管理命名空間四大訪問權限矩陣記心間。static屬類final三重含義abstract規定契約。Object三大契約equals哈希碼toString調試命。泛型擦除編譯期安全集合框架ArrayList優先。反射運行時解剖類Class對象入口FieldMethodConstructor。接口契約單繼承多實現回調別調用我我調用你。內部類四類型匿名最常用動態代理Proxy生成實現。Cloneable標記淺拷貝深拷貝手動遞歸。八大基本類型位數默認值包裝類自動裝箱拆箱緩存陷阱。
這 30 個概念是 Java 程序員的「內功心法」。不求一次全記,但求在編碼、除錯、閱讀源碼時能條件反射般調用。建議:打印核心表格貼工位,每周複習一個專題,半年後必成體系。