int a = 4; int b = a; // 複製值 4 b = 7; // a 仍為 4,不受影響
基本類型儲存實際數值,賦值創建獨立副本。
Number n1 = new Number(); n1.i = 9; Number n2 = new Number(); n2.i = 47; n1 = n2; // n1、n2 指向同一物件 n1.i = 27; // n2.i 也變為 27! // 輸出: // 1: n1.i: 9, n2.i: 47 // 2: n1.i: 47, n2.i: 47 // 3: n1.i: 27, n2.i: 27
原理:物件變數儲存的是參考(句柄),賦值複製參考而非物件本身。原 n1 指向的物件成為垃圾,由 GC 回收。
// 錯誤:產生別名 n1 = n2; // 正確:逐欄位複製值 n1.i = n2.i; // 保持兩個獨立物件
但這違反封裝原則,第 12 章將詳細討論正確解決方案(複製構造器、clone、不可變模式等)。
static void f(Letter y) { y.c = 'z'; } // 修改外部物件
Letter x = new Letter(); x.c = 'a';
f(x); // x.c 變為 'z'
Java 採用傳值呼叫,但傳遞的是參考的值,故方法內修改影響外部物件。
package c03,編譯後置於 c03 子目錄java c03.Assignment(需含完整包名)