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

Java 方法全解析:無參/有參、無返回/有返回、重載、遞歸、可變參數

     編輯:Java 綜合教學

Java 方法核心語法全景圖:從「無參無返回」到「可變參數、遞歸、重載」,一張圖搞定方法定義與調用

方法是 Java 代碼復用的基本單元。本文系統梳理四大基本類型、參數傳遞機制、重載規則、遞歸設計、可變參數、JDK 5+ 新特性,配合記憶口訣與避坑指南,助你徹底掌握方法定義與調用的所有細節。

一、方法四大基本類型對照表

類型定義語法調用方式典型場景
無參無返回public void show() { ... }obj.show();打印菜單、初始化資源、觸發副作用
無參有返回public int add() { return 1+2; }int sum = obj.add();獲取配置、計算常量、工廠方法
有參無返回public void greet(String name) { ... }obj.greet("Tom");設置屬性、輸出日志、執行業務動作
有參有返回public String greet(String name) { return "Hi "+name; }String msg = obj.greet("Tom");計算轉換、查詢數據、核心業務邏輯

二、核心規則速記口訣

  • 定義:修飾符 返回類型 方法名(參數列表) { 方法體 }
  • 命名:駝峰法,動詞開頭 (getXxx, setXxx, isXxx, calculateXxx)
  • 返回值:void 不能 return 值;非 void **所有路徑**必須 return 兼容類型值
  • 參數傳遞:值傳遞。基本類型傳值副本,引用類型傳引用副本(指向同一對象)
  • 實參 vs 形參:調用時傳實參(具體值/變量),定義時聲明形參(類型+名字),**數量、類型、順序嚴格一致**

三、方法重載 —— 同名不同參


public class Calculator {
    public int add(int a, int b) { return a + b; }
    public double add(double a, double b) { return a + b; }
    public int add(int a, int b, int c) { return a + b + c; }
    // 返回類型不同、修飾符不同 不構成重載(編譯錯誤)
}

重載三要素:方法名相同、**參數列表不同**(類型/個數/順序);與返回類型、修飾符、拋出異常無關。

四、遞歸 —— 自己調用自己


// 階乘 n!
public long factorial(int n) {
    if (n <= 1) return 1;           // 基線條件
    return n * factorial(n - 1);    // 遞歸步驟
}

// 斐波那契 (備忘錄優化)
Map memo = new HashMap<>();
public long fib(int n) {
    if (n <= 1) return n;
    if (memo.containsKey(n)) return memo.get(n);
    long res = fib(n-1) + fib(n-2);
    memo.put(n, res);
    return res;
}

遞歸三要素:基線條件 (停止)、**遞歸步驟** (縮小規模)、**調用自身**;缺一不可,否則 StackOverflowError。

五、可變參數 (Varargs) —— JDK 5 语法糖


public int sum(int... numbers) {  // 本質:int[] numbers
    int total = 0;
    for (int n : numbers) total += n;
    return total;
}

// 調用
sum();           // 0
sum(1, 2);       // 3
sum(1, 2, 3, 4); // 10
sum(new int[]{5,6}); // 11 (也可傳數組)

規則:類型... 名字,**只能出現在參數列表最後**,**每個方法最多一個**。編譯器自動將離散實參打包成數組。

六、JDK 5+ 方法相關新特性速覽

特性核心語法本質示例
自動拆裝箱Integer i = 10; int n = i;編譯器插入 valueOf()/intValue()List list; list.add(1); // 自動裝箱
增強 forfor (T x : collection)Iterator 语法糖for (String s : list)
靜態導入import static java.lang.Math.*;直接用類名.方法名sqrt(2) 而非 Math.sqrt(2)
泛型public void swap(T[] a, int i, int j)類型參數化,編譯期擦除集合類型安全
枚舉enum Color { RED, GREEN }類類型,單例模式Color c = Color.RED;

七、實戰避坑檢查清單

  1. void 方法誤寫 return 1; → 編譯錯誤
  2. 非 void 方法缺少 return (如 if-else 分支漏寫) → 編譯錯誤
  3. 基本類型參數修改不影響實參:void change(int x) { x=10; } 外部變量不變
  4. 引用類型參數修改**對象內容**影響實參:void change(List l) { l.add(1); } 外部列表變了
  5. 可變參數與數組重載衝突:foo(int...) vs foo(int[]) → 編譯器報「引用模糊」
  6. 遞歸未寫基線條件 → StackOverflowError

八、綜合練習:實現通用數組工具類


public class ArrayUtils {
    // 1. 可變參數求和
    public static int sum(int... nums) { ... }
    
    // 2. 泛型方法反轉數組
    public static  void reverse(T[] arr) {
        for (int i=0, j=arr.length-1; i> int binarySearch(T[] arr, T target) {
        return binarySearch(arr, target, 0, arr.length - 1);
    }
    private static > int binarySearch(T[] arr, T target, int l, int r) {
        if (l > r) return -1;
        int mid = l + (r - l) / 2;
        int cmp = target.compareTo(arr[mid]);
        if (cmp == 0) return mid;
        return cmp < 0 ? binarySearch(arr, target, l, mid-1) : binarySearch(arr, target, mid+1, r);
    }
}

方法設計的核心原則:**單一職責、參數正交、命名自文檔化、邊界條件防守**。掌握本文所有知識點,你就擁有了編寫高質量 Java 方法的完整工具箱。

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