JavaSE 方法詳解
一、方法的核心概念
方法(Method)是一組執行特定任務的語句集合,它將代碼邏輯封裝為可復用的單元,提高代碼的模塊化和可維護性。
方法的組成:
[修飾符] 返回類型 方法名([參數列表]) {// 方法體[return 返回值;] // 若返回類型為void,則無需return語句
}
二、方法的分類
1. 實例方法
- 特點:通過對象調用,可訪問實例變量和其他實例方法。
- 示例:
public class Person {private String name;// 實例方法public void setName(String name) {this.name = name;}public String getName() {return name;} }// 調用方式 Person p = new Person(); p.setName("張三"); // 必須通過對象調用
2. 靜態方法
- 特點:使用
static
修飾,屬于類而非對象,可直接通過類名調用。 - 限制:只能訪問靜態成員(靜態變量和靜態方法),無
this
關鍵字。 - 示例:
public class MathUtils {// 靜態方法public static int add(int a, int b) {return a + b;} }// 調用方式 int result = MathUtils.add(3, 5); // 直接通過類名調用
3. 構造方法
- 特點:方法名與類名相同,無返回類型,用于初始化對象。
- 分類:無參構造和有參構造。
- 示例:
public class Student {private String name;// 無參構造public Student() {}// 有參構造public Student(String name) {this.name = name;} }
三、方法的參數傳遞
Java中參數傳遞方式為值傳遞:
- 基本類型:傳遞值的副本,方法內修改不影響原始值。
- 引用類型:傳遞引用(內存地址)的副本,方法內可修改對象狀態,但無法重新賦值引用。
示例:
// 基本類型參數
public void modifyValue(int x) {x = 100; // 修改的是副本,不影響原始值
}// 引用類型參數
public void modifyArray(int[] arr) {arr[0] = 100; // 修改數組元素,影響原始對象arr = new int[3]; // 重新賦值引用,不影響原始引用
}
四、方法的重載(Overload)
- 定義:同一類中,方法名相同但參數列表不同的現象。
- 規則:參數的類型、個數或順序不同,與返回類型無關。
- 示例:
public class Calculator {public int add(int a, int b) { return a + b; }public int add(int a, int b, int c) { return a + b + c; } // 參數個數不同public double add(double a, double b) { return a + b; } // 參數類型不同 }
五、方法的重寫(Override)
- 定義:子類重新實現父類中已有的方法。
- 規則:
- 方法名、參數列表、返回類型必須與父類一致(Java 5+ 支持協變返回類型)。
- 訪問修飾符不能比父類更嚴格。
- 不能重寫
final
、static
或private
方法。
- 示例:
public class Animal {public void makeSound() {System.out.println("動物發出聲音");} }public class Dog extends Animal {@Override // 注解:顯式標識重寫public void makeSound() {System.out.println("汪汪叫");} }
六、可變參數(Varargs)
- 語法:
類型... 參數名
- 特點:
- 可變參數本質是數組,可接收0個或多個參數。
- 一個方法最多有一個可變參數,且必須位于參數列表末尾。
- 示例:
public void printNumbers(int... numbers) {for (int num : numbers) {System.out.println(num);} }// 調用方式 printNumbers(1, 2, 3); // 傳遞多個參數 printNumbers(); // 傳遞0個參數
七、方法的遞歸
- 定義:方法直接或間接調用自身。
- 關鍵:
- 遞歸出口(終止條件)。
- 遞歸公式(問題分解)。
- 示例:計算階乘
public int factorial(int n) {if (n <= 1) { // 遞歸出口return 1;}return n * factorial(n - 1); // 遞歸調用 }
八、方法的異常處理
- throws:聲明方法可能拋出的異常。
- try-catch:在方法內部捕獲并處理異常。
- 示例:
public void readFile(String path) throws IOException {// 方法可能拋出IOExceptionFileReader reader = new FileReader(path);// ... }public void safeRead(String path) {try {readFile(path);} catch (IOException e) {// 處理異常} }
九、面試常見問題
-
重載和重寫的區別?
- 重載:同一類中方法名相同但參數不同,編譯時確定。
- 重寫:子類覆蓋父類方法,運行時動態綁定。
-
Java的參數傳遞是值傳遞還是引用傳遞?
- 值傳遞。基本類型傳遞值的副本,引用類型傳遞引用的副本。
-
靜態方法能否調用實例方法?
- 不能,靜態方法屬于類,不依賴對象,而實例方法需要通過對象調用。
-
可變參數的注意事項?
- 一個方法最多有一個可變參數,且必須位于參數列表末尾。
十、最佳實踐
- 單一職責原則:方法應只做一件事,保持代碼簡潔。
- 參數驗證:在方法開始處檢查參數合法性,避免空指針異常。
- 避免過長方法:超過100行的方法應考慮拆分。
- 遞歸優化:遞歸可能導致棧溢出,復雜問題優先使用迭代。
方法是Java編程的基本單元,合理設計和使用方法是提高代碼質量的關鍵。