**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,數據將錯亂。**解決:深拷貝**。
new Model() + 逐字段 set。Cloneable + 重寫 clone()(淺拷貝需手工深拷貝引用字段)。new Model(src.getValue())。Model model2 = new Model(); model2 = model; // 僅複製引用,仍指向同一對象 model2.setValue(2); // 依然修改原對象
String、包裝類、LocalDate 等)。