Java 中操作物件實際上操作的是參考(引用)。「將一個物件指派給另一個物件」,本質是將參考從一個變數複製到另一個變數,兩個變數指向堆記憶體中同一個物件實例。本文透過經典 Tank 範例圖解參考指派行為。
class Tank {
int level;
}
public class AssignmentObjects {
public static void main(String[] args) {
Tank t1 = new Tank(); // t1 指向物件 A
Tank t2 = new Tank(); // t2 指向物件 B
t1.level = 9;
t2.level = 47;
System.out.println("t1 is " + t1.level + " t2 is " + t2.level); // 9, 47
t1 = t2; // t1 現在也指向物件 B,物件 A 失去引用(待 GC)
System.out.println("t1 is " + t1.level + " t2 is " + t2.level); // 47, 47
t1.level = 27; // 透過 t1 修改物件 B 的屬性
System.out.println("t1 is " + t1.level + " t2 is " + t2.level); // 27, 27
}
}
Tank 實例(level 9 與 47)。level,t2 讀取同一記憶體位置,故同步看到 27。| 操作 | 說明 |
|---|---|
Tank t = new Tank() | 棟建立參考變數 t,堆上配置物件,t 存放物件位址 |
t1 = t2 | 複製參考值(位址),不複製物件本身 |
修改 t1.level | 透過參考定位物件,修改其內部狀態,所有指向該物件的參考均可見 |
| 方法傳參 | 同理:傳遞參考副本,方法內修改物件屬性會影響外部;但重新指派參數變數(param = new Tank())不影響外部原參考 |
= 僅複製參考。clone() 或建構子複製 new Tank(t)。String, Integer)天然避免共享修改問題。final 防止重新指派(但仍可修改物件內部狀態)。