方法是 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 兼容類型值
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。
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 (也可傳數組)
規則:類型... 名字,**只能出現在參數列表最後**,**每個方法最多一個**。編譯器自動將離散實參打包成數組。
| 特性 | 核心語法 | 本質 | 示例 |
|---|---|---|---|
| 自動拆裝箱 | Integer i = 10; int n = i; | 編譯器插入 valueOf()/intValue() | List |
| 增強 for | for (T x : collection) | Iterator 语法糖 | for (String s : list) |
| 靜態導入 | import static java.lang.Math.*; | 直接用類名.方法名 | sqrt(2) 而非 Math.sqrt(2) |
| 泛型 | public | 類型參數化,編譯期擦除 | 集合類型安全 |
| 枚舉 | enum Color { RED, GREEN } | 類類型,單例模式 | Color c = Color.RED; |
void 方法誤寫 return 1; → 編譯錯誤void 方法缺少 return (如 if-else 分支漏寫) → 編譯錯誤void change(int x) { x=10; } 外部變量不變void change(List l) { l.add(1); } 外部列表變了foo(int...) vs foo(int[]) → 編譯器報「引用模糊」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 方法的完整工具箱。