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

Java 類之間賦值失效:引用傳遞誤區與正確模式

     編輯:程式設計綜合問答

問題現象

三個類 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"
    }
}

進階理解

  • 引用傳值 ≠ 引用傳遞:Java 無傳引用機制,方法參數接收的是引用的副本。
  • 可變對象共享:若傳遞同一可變對象引用,多方可修改其內部狀態(如集合、自定義 Bean)。
  • 不可變對象:String、包裝類等不可變,傳遞後無法修改原對象,只能重新賦值引用。

最佳實踐

  1. 方法設計時明確參數所有權:需修改調用者對象狀態則傳入引用;需隔離則內部新建。
  2. 構造器或工廠方法統一創建核心數據對象,避免多處 new 導致邏輯分散。
  3. 使用依賴注入框架管理對象生命周期,減少手動傳遞錯誤。

理解 Java 值傳遞本質,是避免此類低級錯誤的關鍵。通過參數傳遞共享同一實例,即可實現跨類數據同步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved