方法是 Java 面向對象編程中實現行為封裝的核心機制。本文從零開始,通過 Person 類實例,徹底講透成員方法的定義語法、調用機制、參數傳遞本質、重載規則及常見誤區,幫助初學者建立扎實的方法設計思維。
[修飾符] 返回值類型 方法名([參數類型 參數名, ...]) {
// 方法體語句
[return 返回值;]
}
public/private/protected (存取控制)、static (類方法)、final (禁止重寫)、abstract (無實現)。void (無返回)。public class Person {
// 實例變量 (屬性)
private String name;
private int age;
// 構造器
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter/Setter (封裝)
public String getName() { return name; }
public void setName(String name) { this.name = name; }
// ... age 同理
}
/** 輸出自我介紹 */
public void speak() {
System.out.println("我是 " + name + ",今年 " + age + " 歲,是個大好人!");
}
/** 計算 1+2+...+n 並輸出結果 */
public void calculateSum(int n) {
if (n <= 0) {
System.out.println("請輸入正整數!");
return; // 提前結束 void 方法
}
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
System.out.println("1 到 " + n + " 的和是:" + sum);
}
/** 計算兩數之和並返回 */
public int add(int a, int b) {
return a + b; // 必須有返回值
}
// 重載版本:支持三數求和
public int add(int a, int b, int c) {
return a + b + c;
}
public class Demo {
public static void main(String[] args) {
// 創建對象
Person p1 = new Person("張三", 20);
// 調用無參方法
p1.speak(); // 輸出:我是 張三,今年 20 歲,是個大好人!
// 調用帶參方法
p1.calculateSum(100); // 輸出:1 到 100 的和是:5050
// 調用帶返回方法,接收結果
int result = p1.add(13, 11);
System.out.println("13 + 11 = " + result); // 24
// 重載調用
int result3 = p1.add(1, 2, 3);
System.out.println("1+2+3 = " + result3); // 6
}
}
public class ParamDemo {
public static void main(String[] args) {
int num = 10;
changePrimitive(num);
System.out.println("基本類型:" + num); // 10 未變
Person p = new Person("李四", 25);
changeRef(p);
System.out.println("引用類型名字:" + p.getName()); // "王五" 已變!
swapRef(p, new Person("趙六", 30));
System.out.println("交換後名字:" + p.getName()); // "李四" 未變!引用地址未交換
}
// 基本類型:傳值副本,無法修改原變量
static void changePrimitive(int x) { x = 20; }
// 引用類型:傳引用副本 (地址),可修改對象內部狀態
static void changeRef(Person p) { p.setName("王五"); }
// 嘗試交換引用:失敗!Java 無傳引用的引用
static void swapRef(Person a, Person b) { Person tmp = a; a = b; b = tmp; }
}
| 重載條件 | 同一類中 | 說明 |
|---|---|---|
| 方法名 | 相同 | 必須 |
| 參數列表 | 不同 (類型/個數/順序) | 核心判斷依據 |
| 返回類型 | 可相同可不同 | 不可作為唯一區分依據 |
| 修飾符/異常 | 無限制 | 不影響重載 |
public void test(int a) { System.out.println("int"); }
public void test(long a) { System.out.println("long"); }
public void test(double a) { System.out.println("double"); }
// 呼叫
test(10); // int
test(10L); // long
test(10.0); // double
test('A'); // int (char 提升為 int)
test(10F); // double (float 提升為 double)
// 短/位元組/字符調用無參版本會提升至 int
return; 或省略。this.field 或 nonStaticMethod() 編譯報錯。StackOverflowError。default void log() { ... },實現類可不重寫。static String format() { ... },工具方法歸屬介面。list.forEach(System.out::println) 替代 Lambda。成員方法是對象行為的載體。掌握「定義規範、調用機制、值傳遞本質、重載規則」,並養成「單一職責、參數校驗、異常處理、命名語義化」的編碼習慣,是邁向高質量 Java 開發的基石。建議動手敲碼運行本文所有範例,在實踐中內化知識。