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

Java 物件指派與參考傳遞深度解析

     編輯:Java 綜合教學

Java 物件指派與參考傳遞深度解析

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
    }
}

記憶體模型圖解

  1. 建立 t1, t2:棧上兩個參考變數,分別指向堆上兩個不同的 Tank 實例(level 9 與 47)。
  2. 執行 t1 = t2:t1 的參考值被覆寫為 t2 的參考值,兩者同指物件 B。物件 A 無參考指向,成為垃圾回收候選者。
  3. 修改 t1.level:透過 t1 修改物件 B 的 level,t2 讀取同一記憶體位置,故同步看到 27。

核心觀念總結

操作說明
Tank t = new Tank()棟建立參考變數 t,堆上配置物件,t 存放物件位址
t1 = t2複製參考值(位址),不複製物件本身
修改 t1.level透過參考定位物件,修改其內部狀態,所有指向該物件的參考均可見
方法傳參同理:傳遞參考副本,方法內修改物件屬性會影響外部;但重新指派參數變數(param = new Tank())不影響外部原參考

常見誤區

  • 誤以為指派會複製物件:Java 無運算子多載,= 僅複製參考。
  • 誤以為方法傳參是傳值:基本型別傳值副本;引用型別傳參考副本(仍指向同一物件)。

最佳實踐

  1. 若需獨立副本,實作 clone() 或建構子複製 new Tank(t)。
  2. 不可變物件(如 String, Integer)天然避免共享修改問題。
  3. 方法參數若不應被修改,標記 final 防止重新指派(但仍可修改物件內部狀態)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved