一、核心概念辨析
| 概念 | 定義 | 比喻 |
| 類別 | 抽象模板,定義屬性與行為 | 建築藍圖 |
| 物件 | 類別的具體實例,佔有記憶體 | 依藍圖建好的房子 |
| 關係 | 類別是物件的類型;物件是類別的實例化 | 一張藍圖 → 可建多棟房子 |
二、Java 中定義類別
public class Person {
// 屬性(成員變數)
private String name;
private int age;
private String gender;
// 建構子
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
// 方法(行為)
public void introduce() {
System.out.println("我是 " + name + ",今年 " + age + " 歲,性別:" + gender);
}
// Getter/Setter
public String getName() { return name; }
public void setName(String name) { this.name = name; }
// ... 省略 age、gender
}
三、物件的宣告、實例化與初始化
// 1. 宣告參考變數(棧上,佔 4/8 bytes)
Person p1;
// 2. 實例化:new 分配堆記憶體,呼叫建構子初始化
p1 = new Person("小明", 18, "男");
// 3. 合寫
Person p2 = new Person("小紅", 20, "女");
記憶體圖解
棧 堆
┌─────────┐ ┌──────────────────┐
│ p1 ─────┼────────▶ │ Person 对象 │
└─────────┘ │ name="小明" │
│ age=18 │
│ gender="男" │
└──────────────────┘
四、完整範例:空調類別
public class AirConditioner {
// 屬性
String brand;
String model;
int power; // 匹數
int temperature;
// 行為
public void cool() { temperature--; }
public void heat() { temperature += 2; }
public void display() {
System.out.println(brand + " " + model + " (" + power + "匹) 當前溫度:" + temperature + "°C");
}
public static void main(String[] args) {
AirConditioner ac = new AirConditioner();
ac.brand = "美的";
ac.model = "KFR-35GW";
ac.power = 1.5;
ac.temperature = 26;
ac.cool(); // 25°C
ac.heat(); // 27°C
ac.display();
}
}
五、深度補充:記憶體模型與生命週期
1. 物件建立流程
- 類別載入檢查
- 堆記憶體分配(指標碰撞/空閒列表)
- 記憶體歸零(除 object header)
- 設定 object header(類別指標、HashCode、GC 年齡、鎖狀態)
- 執行 `` 方法(建構子邏輯、欄位初始化)
2. 物件存取定位
- 句柄池:reference → handle → (instance data, type data)
- 直接指標:reference → instance data(HotSpot 預設)
3. 物件銷毀與 GC
- 不可達物件 → 標記-清除/整理/複製 → 回收
finalize() 已棄用,改用 try-with-resources / Cleaner
六、常見誤區
| 誤區 | 正確認知 |
| 類別與物件同義 | 類別是模板,物件是實例;一個類別可建多個物件 |
| new 每次建立相同內容 | 每次 new 分配新記憶體,地址不同;內容相同但非同一物件 |
| 參考變數即物件 | 參考變數在棧,物件在堆;參考可為 null、可重新指向 |