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

Java 參數傳遞機制實證:值傳遞鐵律與對象引用陷阱

     編輯:Java 綜合教學

核心結論

**Java 唯一參數傳遞方式:按值傳遞(Call by Value)。**
  • 基本類型:傳**值的拷貝**。
  • 引用類型:傳**引用(地址)的拷貝**。

實戰代碼驗證

public class Model { private int value; /* getter/setter */ }

public class Demo {
    public static void main(String[] args) {
        String str = "str";
        int i = 1;
        Model model = new Model(); model.setValue(1);

        new Demo().fun(str, i, model);

        System.out.println(str + "\t" + i + "\t" + model.getValue());
        // 輸出:str  1  2
    }

    public void fun(String str, int i, Model model) {
        str = "fun_str";      // 修改局部引用指向新對象
        i = 2;                // 修改局部基本類型拷貝
        model.setValue(2);    // 通過引用拷貝修改**原對象內容**
        System.out.println(str + "\t" + i + "\t" + model.getValue());
        // 輸出:fun_str  2  2
    }
}

關鍵現象解析

參數方法內操作外部影響原因
String str重新賦值無引用拷貝指向新對象,原引用不變
int i修改值無基本類型值拷貝
Model model調用 setter 修改字段**有**引用拷貝指向**同一堆對象**

多線程共享對象災難

若多線程共用同一 Model 實例並並發 setValue,數據將錯亂。**解決:深拷貝**。

深拷貝實現路徑

  1. 手工 new Model() + 逐字段 set。
  2. 實現 Cloneable + 重寫 clone()(淺拷貝需手工深拷貝引用字段)。
  3. 序列化/反序列化(通用但較慢)。
  4. 構造器拷貝:new Model(src.getValue())。

錯誤嘗試:淺拷貝無效

Model model2 = new Model();
model2 = model; // 僅複製引用,仍指向同一對象
model2.setValue(2); // 依然修改原對象

最佳實踐

  • 方法參數盡量用基本類型或不可變對象(String、包裝類、LocalDate 等)。
  • 可變對象作為參數時,**明確文檔說明是否允許修改內容**;多線程場景**必須深拷貝**或使用線程安全容器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved