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

Java 參數傳遞機制終極解析:按值傳遞無例外

     編輯:Java 程式設計入門

結論先行

Java **只有按值傳遞**。無論基本型別還是參考型別,方法收到的都是**實參值的副本**。

兩類型別的行為差異

1. 基本型別

直接包含數值。副本修改不影響原變數。

public static void changePrimitive(int p) { p = 3; }
int primitive = 2;
changePrimitive(primitive);
// primitive 仍為 2

2. 參考型別

變數儲存的是**物件在堆上的位址(引用值)**。傳遞的是**引用值的副本**。

  • 修改物件內部狀態:透過副本引用同一物件,修改**生效**。
    public static void changeObject(MyClass obj) { obj.i = 3; }
    MyClass mc = new MyClass(); mc.i = 1;
    changeObject(mc);
    // mc.i 變為 3
  • 重新指向新物件:參數變數指向新物件,**不影響**原實參引用。
    public static void changeObject(MyClass obj) { obj = new MyClass(); }
    MyClass mc = new MyClass();
    changeObject(mc);
    // mc 仍指向原物件

完整驗證程式碼

public class ParameterPassingDemo {
    public static void main(String[] args) {
        // 基本型別
        int primitive = 2;
        changePrimitive(primitive);
        System.out.println("primitive = " + primitive); // 2

        // 參考型別:修改內部狀態
        MyClass obj1 = new MyClass();
        obj1.i = 1;
        changeObjectState(obj1);
        System.out.println("obj1.i = " + obj1.i); // 3

        // 參考型別:重新指向
        MyClass obj2 = new MyClass();
        obj2.i = 1;
        changeObjectRef(obj2);
        System.out.println("obj2.i = " + obj2.i); // 1 (未變)
        System.out.println("obj2 == original? " + (obj2 == originalRef)); // true
    }

    static void changePrimitive(int p) { p = 3; }

    static void changeObjectState(MyClass obj) { obj.i = 3; }

    static MyClass originalRef; // 用於驗證引用是否改變
    static void changeObjectRef(MyClass obj) {
        originalRef = obj; // 保存原引用
        obj = new MyClass(); // 參數指向新物件
        obj.i = 99;
    }
}

class MyClass { int i; }

遠端呼叫(RMI/EJB)特殊性

遠端介面傳遞參數時,無論型別,**一律進行序列化/反序列化**,客戶端與伺服器端擁有**獨立物件副本**,雙向修改互不影響(除非使用遠端物件引用 Remote)。本地介面則同本地語義。

記憶體模型視覺化

棧幀 (main)          堆
+-----------+        +-----------------+
| primitive | 2      |                 |
+-----------+        |  MyClass@1234   |← obj1, 參數 obj (同一引用值)
| obj1      | ──────→| i = 1 → 3       |
+-----------+        +-----------------+
| obj2      | ──────→|  MyClass@5678   |← obj2
+-----------+        | i = 1           |    參數 obj → 新建 MyClass@9999 (i=99)
                     +-----------------+    obj2 仍指向 @5678

常見誤區釐清

  • ❌ 「Java 物件傳遞是按引用傳遞」→ 錯誤。引用值本身是按值傳遞。
  • ❌ 「C++ 指標傳遞 = Java 參考傳遞」→ C++ 可傳遞指標位址(指標的指標)修改原指標,Java 無此機制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved