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

Java 方法設計實踐:從無參無返到參數傳遞、返回值與深淺拷貝陷阱

     編輯:Java 綜合教學

方法設計三要素

  1. 明確職責:該方法要完成什麼具體任務?
  2. 確定輸入:需要哪些參數(形參)?
  3. 確定輸出:是否需要返回值?返回什麼類型?

三類典型方法模式

1. 純執行動作(無參、無返)

public void welcome() {
    System.out.println("Welcome to Car Rental System!");
    System.out.println("Rent a car? 1.Yes 2.No");
}

主流程直接調用,無數據流入流出。

2. 數據處理展示(有參、無返)

public void printCars(Car[] cars) {
    System.out.printf("No.\tBrand\tPrice\tCapacity%n");
    for (int i = 0; i < cars.length; i++) {
        System.out.printf("%d\t%s\t%d\t%d%n", i+1, cars[i].getBrand(), cars[i].getPrice(), cars[i].getCapacity());
    }
}

接收外部數據(引用傳遞),負責格式化輸出,不產生新數據返回。

3. 計算產出結果(有參、有返)

public int calcPrice(Car[] cars, int index) {
    return cars[index].getPrice();
}

接收數據,經過業務邏輯加工,返回結果供調用者使用(如打印賬單)。

參數傳遞機制鐵律(重中之重)

**Java 只有值傳遞。基本類型傳值拷貝;引用類型傳引用(地址)拷貝。**

參數傳遞示意圖

代碼驗證

public class ArgsTransfer {
    public static void main(String[] args) {
        ArgsTransfer t = new ArgsTransfer();
        int a = 5, b = 10;
        System.out.println("a=" + a + " b=" + b + " ret=" + t.swap(a, b));
        // 輸出:a=5 b=10 ret=10
    }
    public int swap(int i, int j) {
        int temp = i; i = j; j = temp; // 僅交換局部拷貝
        return i; // 返回 10
    }
}
  • 主方法 a,b 不變(值拷貝)。
  • 返回值 10 來自方法內局部變量 i。

對象引用陷阱與深拷貝

public void modify(Model m) {
    m.setValue(2);        // 修改原對象內容 → 外部可見
    m = new Model();      // 重新賦值局部引用 → 外部不可見
    m.setValue(3);        // 修改新對象
}

若多線程共享同一可變對象 → 數據競爭。**解決:深拷貝**。

深拷貝四種路徑

  1. 手工構造新對象 + 逐字段賦值。
  2. 實現 Cloneable + 重寫 clone()(注意引用字段需遞歸 clone)。
  3. 序列化/反序列化(通用、較慢)。
  4. 構造器拷貝:new Model(src.getValue())。

最佳實踐清單

  • 方法職責單一,名稱動詞開頭(calc/get/print/save)。
  • 參數列表 ≤ 4 個,超過考慮封裝為參數對象(POJO/Builder)。
  • 優先返回不可變對象或基本類型;必須返回可變對象時,文檔說明所有權轉移或防禦性拷貝。
  • 避免在方法中修改參數對象狀態(副作用),若必須修改,方法名體現(如 fillData(dto))。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved