1. 導言
先從一個問題開始:方法到底為什麼要回傳東西?為什麼不能乾脆把所有事都在方法內做完,然後把結果直接輸出到螢幕上?
原因在於,我們常常不只是要執行某個動作,還需要取得一個結果,日後可以在程式的其他部分使用。比如:
- 方法計算兩個數的總和並回傳,讓我們能把結果拿去做進一步運算。
- 方法判斷某個數是否為偶數,並回傳 true 或 false,讓我們能做出決策。
- 方法回傳一段給使用者的問候字串,而我們再決定把它用在哪裡——顯示在螢幕上、寫入檔案、或透過網路傳送。
如果方法總是只會印出結果,我們的程式就會被綁死在單一情境,想要重複使用該邏輯就會很麻煩。回傳值讓方法更有彈性,也更通用。
類比
想像一下咖啡販賣機。你投入錢、按下按鈕——然後拿到咖啡。如果販賣機只是大聲說「咖啡煮好了!」(但不給你咖啡),你一定不會高興。方法也是如此:有時候我們不只是想聽到「完成!」,而是真的要拿到一個結果。
2. 回傳型別:方法可以回傳什麼
在 Java 中,宣告方法時需要指定回傳值的型別——可以是任何型別:int、double、String、boolean、陣列,甚至是你自己類別的物件。如果方法什麼都不回傳——就寫 void。
語法:
tip_vozvrashchaemogo_znacheniya imyaMetoda(parametry)
{
// 方法本體
}
範例:
int sum(int a, int b)
{
// 回傳 int
}
String getGreeting(String name)
{
// 回傳 String
}
boolean isEven(int number)
{
// 回傳 boolean
}
void printHello()
{
// 不回傳任何值——只執行動作
}
重要! 回傳型別是方法的「承諾」:它必須回傳該型別的值。如果你承諾回傳 int,卻回傳了 String——編譯器會提出異議並拒絕編譯程式。
3. 運算子 return:如何從方法回傳值
要把方法的執行結果真正「交出去」,就要使用 return。這個關鍵字的意思是: 「給你結果——而我的工作到此結束」。
int sum(int a, int b)
{
int result = a + b;
return result; // 回傳結果
}
還可以更簡短:
int sum(int a, int b)
{
return a + b;
}
當方法執行到 return 這一行時,它就會結束執行、回傳指定的值,並把該值交回到被呼叫的位置。
重要: return 後面的值,其型別必須與方法宣告的回傳型別一致。
4. 使用回傳值:該拿它做什麼?
當方法回傳了某個值,你可以:
- 把它存到變數。
- 直接在運算式中使用。
- 傳給其他方法。
int result = sum(5, 7); // 存到變數
System.out.println(result); // 輸出結果
System.out.println(sum(10, 20)); // 直接輸出結果
if (isEven(42))
{
System.out.println("這個數是偶數!");
}
範例:回傳字串的方法
String getGreeting(String name)
{
return "你好," + name + "!";
}
// 使用方式:
String greeting = getGreeting("Alisa");
System.out.println(greeting); // 你好,Alisa!
5. 實作:具有回傳值的方法範例
回傳兩數之最大值的方法
int max(int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
如果你已經掌握了三元運算子,還能更精簡:
int max(int a, int b)
{
return (a > b) ? a : b;
}
使用方式:
int maximum = max(10, 25);
System.out.println("最大值:" + maximum); // 最大值:25
回傳 true(若數字為偶數)的方法
boolean isEven(int number)
{
return number % 2 == 0;
}
使用方式:
if (isEven(18))
{
System.out.println("這個數是偶數!");
}
else
{
System.out.println("這個數是奇數!");
}
回傳陣列元素總和的方法
int sumArray(int[] arr)
{
int sum = 0;
for (int i = 0; i < arr.length; i++)
{
sum += arr[i];
}
return sum;
}
使用方式:
int[] grades = {5, 4, 3, 5, 4};
int total = sumArray(grades);
System.out.println("成績總和:" + total);
6. 呼叫含 return 的方法時會發生什麼
當你呼叫一個有回傳值的方法時,程式的執行就像「進入」方法內,執行它的程式碼,遇到 return 時回傳值——然後把該值帶回並替換呼叫處。
示意:
int a = 2;
int b = 3;
int c = sum(a, b); // 這裡呼叫了 sum(2, 3),回傳 5,c 變為 5
流程圖
graph TD
A["main"] --> B["sum(a, b)"]
B --> C[計算]
C --> D[return result]
D -->|結果被回傳| A
7. 實用細節
return 會結束方法的執行
一旦在方法中遇到 return,方法就會立刻中止。寫在它後面的內容——都不會執行。
int test()
{
return 42;
System.out.println("這不會被列印"); // unreachable
}
return 在 void 方法中
在不回傳值的 void 方法中,可以使用不帶值的 return——單純為了提前結束方法,例如在某個條件成立時。
void printPositive(int number)
{
if (number <= 0)
{
System.out.println("這個數不是正數!");
return; // 直接結束方法
}
System.out.println("數字:" + number);
}
8. 使用 return 時的常見錯誤
錯誤 1:不是所有路徑都會回傳值
int getSign(int number)
{
if (number > 0)
{
return 1;
}
// 那如果 number <= 0 呢?沒有 return!
}
// 錯誤:並非所有程式路徑都回傳值
如何修正: 確保在所有執行路徑上都能執行到 return。
int getSign(int number)
{
if (number > 0)
{
return 1;
}
else if (number < 0)
{
return -1;
}
else
{
return 0;
}
}
錯誤 2:回傳值型別不相符
int getNumber()
{
return "42"; // 錯誤!預期是 int,而不是 String
}
錯誤 3:return 之後還有程式碼
int test()
{
return 5;
System.out.println("這不會被執行"); // unreachable statement
}
錯誤 4:在 void 方法中用帶表達式的 return
void printSomething()
{
return 42; // 錯誤!void 方法不能回傳值
}
錯誤 5:忽略回傳值
sum(10, 20); // 就這樣?結果不見了!
如果你不使用回傳值,它就會被丟棄。別忘了把它儲存起來或傳遞到後續的程式碼!
錯誤 6:以為 return 會把內容印出來
int result = sum(2, 3);
// return 什麼也不會列印!
// 需要明確列印:
System.out.println(result);
GO TO FULL VERSION