首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 賦值機制深度解析:基本類型複製 vs 物件參考共享(別名問題)

     編輯:Java 相關知識

基本類型:值複製,相互獨立

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 與執行說明

  • 範例使用 package c03,編譯後置於 c03 子目錄
  • 執行命令:java c03.Assignment(需含完整包名)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved