Java 程序由一個個類組成,而類的內部結構決定了對象的行為與狀態。本文深入剖析類的四大核心成員——成員變量(字段)、構造器、方法、初始化塊——的定義、分類、執行順序與相互關係,幫你建立清晰的面向對象思維模型。
| 成員 | 關鍵字/標識 | 核心作用 | 歸屬 |
|---|---|---|---|
| 成員變量 | static (可選) | 描述對象狀態/屬性 | 類/實例 |
| 構造器 | 無返回類型、同類名 | 初始化對象、分配內存 | 實例 |
| 方法 | 有返回類型 (void 含) | 定義對象行為/功能 | 類/實例 |
| 初始化塊 | { ... } / static { ... } | 補充初始化邏輯 | 類/實例 |
public class Demo {
static int count = 0; // 類變量
}
static 修飾Demo.count 或 obj.count (不推薦)public class Demo {
String name; // 實例變量
}
static 修飾obj.name| 修飾符 | 可見性 | 典型用途 |
|---|---|---|
private | 同一類內部 | 封裝核心數據,配合 Getter/Setter |
default (包私有) | 同一包內 | 包內協作類訪問 |
protected | 同包 + 子類 | 繼承體系共享字段 |
public | 任意位置 | 常量定義 (public static final) |
void 都不能寫public class User {
private String name;
private int age;
private String email;
// 主構造器 (全參)
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
// 便利構造器調用主構造器
public User(String name, int age) {
this(name, age, "default@example.com"); // 必須首行
}
public User(String name) {
this(name, 18); // 間接調用主構造器
}
}
修飾符 返回類型 方法名(參數列表) [throws 異常列表] { 方法體 }
| 維度 | 方法 | 函數 (過程式) |
|---|---|---|
| 所屬 | 類/對象 | 獨立存在 |
| 數據訪問 | 可直接訪問對象字段 | 需通過參數傳遞 |
| 多態支持 | 支持重寫/重載 | 不支持 |
| this 引用 | 隱式持有 | 無 |
// 變長參數 (本質是數組)
public void printUsers(String... names) {
for (String name : names) System.out.println(name);
}
// 重載規則:參數列表不同 (類型/個數/順序)
// 與返回類型、修飾符、異常無關
public int add(int a, int b) { return a + b; }
public double add(double a, double b) { return a + b; }
public int add(int a, int b, int c) { return a + b + c; }
public class Demo {
static {
System.out.println("類加載時執行,僅一次");
// 初始化靜態資源:加載配置、註冊驅動
}
}
static { }public class Demo {
{
System.out.println("每次創建對象執行");
// 通用初始化邏輯:計數器、日誌
}
}
{ }public class OrderTest {
static { System.out.println("1. 父類靜態塊"); }
static int s = print("2. 父類靜態變量");
{ System.out.println("3. 父類實例塊"); }
int i = print("4. 父類實例變量");
public OrderTest() { System.out.println("5. 父類構造器"); }
static int print(String s) { System.out.println(s); return 0; }
}
class Sub extends OrderTest {
static { System.out.println("6. 子類靜態塊"); }
static int s = print("7. 子類靜態變量");
{ System.out.println("8. 子類實例塊"); }
int i = print("9. 子類實例變量");
public Sub() { System.out.println("10. 子類構造器"); }
public static void main(String[] args) {
new Sub();
}
}
/* 輸出順序:
1. 父類靜態塊
2. 父類靜態變量
6. 子類靜態塊
7. 子類靜態變量
3. 父類實例塊
4. 父類實例變量
5. 父類構造器
8. 子類實例塊
9. 子類實例變量
10. 子類構造器
*/
靜態優於實例,父類優於子類,塊優於構造,按序逐行執行
正如原文所言:「面向對象的根本含義就是,讓程序像人一樣思考。用人類的數據結構來類比程序。」
掌握類的四大成員及其交互規則,是寫出高質量 Java 代碼的基石。記住:字段描述「是什麼」,方法定義「能做什麼」,構造器負責「怎麼開始」,初始化塊補充「共同準備」。