三個類 Dto、R、Main。在 R.hehe() 中創建 Dto 並設置屬性,但在 Main 中新建 Dto 打印卻為 null。代碼如下:
public class Dto {
public String hehe;
public String getHehe() { return hehe; }
public void setHehe(String hehe) { this.hehe = hehe; }
}
public class R {
public void hehe() {
String test = "test";
Dto dto = new Dto();
dto.setHehe(test);
}
}
public class Main {
public static void main(String[] args) {
R r = new R();
r.hehe();
Dto dto = new Dto();
System.out.print(dto.getHehe()); // 輸出 null
}
}
Java 採用值傳遞機制,對象引用的值(即內存地址)被複製傳遞。R.hehe() 內部 `new Dto()` 創建的對象與 `Main` 中 `new Dto()` 是兩個獨立實例,修改前者不影響後者。兩個 dto 變量雖同名但屬於不同作用域,指向不同堆內存地址。
將 Dto 實例作為參數傳遞給 R.hehe(),使雙方操作同一對象:
public class R {
public void hehe(Dto dto) { // 接收外部傳入的引用
String test = "test";
dto.setHehe(test);
}
}
public class Main {
public static void main(String[] args) {
R r = new R();
Dto dto = new Dto(); // 單一實例
r.hehe(dto); // 傳遞引用
System.out.print(dto.getHehe()); // 輸出 "test"
}
}
String、包裝類等不可變,傳遞後無法修改原對象,只能重新賦值引用。new 導致邏輯分散。理解 Java 值傳遞本質,是避免此類低級錯誤的關鍵。通過參數傳遞共享同一實例,即可實現跨類數據同步。