眾所周知,Java 語言是一種面向對象的編程語言。換句話說,基礎概念,即基礎的基礎,就是萬物皆對象。對像是使用類來描述的。反過來,類定義狀態和行為。例如,銀行賬戶可能具有賬戶金額形式的狀態,並具有增加和減少賬戶餘額的行為。在 Java 中,行為是通過方法實現的。學習如何定義方法是您學習 Java 的最開始。例如,在 Oracle 的官方教程中,在“ Defining Methods ”標題下。這裡有兩件重要的事情需要注意:
- 每個方法都有一個簽名。簽名由方法名稱及其輸入參數組成。
- 必須為方法指定返回類型。您在方法聲明中聲明方法的返回類型。

Java 中 return 的作用是什麼
return關鍵字是一個控制流語句,如此處的Oracle教程中所述。您還可以在官方教程的“從方法返回值”部分了解如何返回值。編譯器會仔細跟踪它是否可以確保方法的返回值與方法指定的返回類型相匹配。讓我們使用Tutorialspoint 的在線 IDE 來考慮一個例子。讓我們看一下原始示例:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
可以看到,這裡執行了main方法,是程序的入口。代碼行從上到下執行。我們的主要方法不能返回值。如果我們試圖在那裡返回一個值,我們將得到一個錯誤:“錯誤:Main 方法必須返回一個類型為 void 的值”。因此,該方法簡單地輸出到屏幕。現在讓我們將字符串文字移動到一個單獨的方法中來生成消息:
public class HelloWorld {
public static void main(String[] args) {
System.out.println(getHelloMessage());
}
public static String getHelloMessage() {
return "Hello World";
}
}
如我們所見,我們使用return關鍵字來指示返回值,然後我們將其傳遞給println方法。getHelloMessage方法的聲明表明該方法將返回一個String。這允許編譯器檢查方法的操作是否與其聲明的方式一致。當然,方法聲明中指定的返回類型可以比代碼中實際返回值的類型更廣泛,即重要的是類型轉換是可能的。否則,我們會在編譯時得到一個錯誤:“Error: incompatible types”。對了,你可能有一個疑問:為什麼是return考慮控制流語句?因為它會破壞程序正常的自上而下流程。例子:
public class HelloWorld {
public static void main(String[] args) {
if (args.length == 0) {
return;
}
for (String arg : args) {
System.out.println(arg);
}
}
}
從示例中可以看出,如果調用不帶參數的 Java 程序中的main方法,我們將中斷該方法。重要的是要記住,如果您在return語句之後有代碼,它將不可訪問。我們的智能編譯器會注意到它並阻止您運行這樣的程序。例如,這段代碼無法編譯:
public static void main(String[] args) {
System.out.println("1");
return;
// we use output method after return statement, which is incorrect
System.out.println("2");
}
有一個骯髒的技巧可以解決這個問題。例如,出於調試目的,或出於某些其他原因。上面的代碼可以通過將return語句包裝在if塊中來修復:
if (2==2) {
return;
}
錯誤處理期間的返回語句
還有其他一些非常棘手的事情——我們可以將return與錯誤處理結合使用。我想馬上說在catch塊中使用return語句是非常非常糟糕的形式,所以你應該避免它。但我們需要一個例子,對吧?這裡是:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Value: " + getIntValue());
}
public static int getIntValue() {
int value = 1;
try {
System.out.println("Something terrible happens");
throw new Exception();
} catch (Exception e) {
System.out.println("Cached value: " + value);
return value;
} finally {
value++;
System.out.println("New value: " + value);
}
}
}
乍一看,似乎應該返回 2,因為finally總是被執行。但是不,返回值將是 1, finally塊中對變量的更改將被忽略。此外,假設value包含一個對象,我們在finally塊中說value = null。然後該對象,而不是 null,將在catch塊中返回。但是return語句在finally塊中可以正常工作。顯然,您的同事不會因為涉及退貨單的小驚喜而感謝您。
void.class
最後。您可以編寫一個奇怪的結構:void.class。唔。為什麼以及它是什麼意思?確實存在涉及Java 反射 API 的各種框架和棘手案例,在這些情況下這可能非常有用。例如,您可以檢查方法返回的類型:
import java.lang.reflect.Method;
public class HelloWorld {
public void getVoidValue() {
}
public static void main(String[] args) {
for (Method method : HelloWorld.class.getDeclaredMethods()) {
System.out.println(method.getReturnType() == void.class);
}
}
}
這在需要替換方法中的實際代碼的測試框架中很有用。但要做到這一點,您需要了解方法的行為方式(即返回的類型)。上面代碼中的 main方法還有第二種實現方式:
public static void main(String[] args) {
for (Method method : HelloWorld.class.getDeclaredMethods()) {
System.out.println(method.getReturnType() == Void.TYPE);
}
}
您可以在 Stack Overflow 上閱讀關於兩者之間差異的非常有趣的討論:What is the difference between java.lang.Void and void?
GO TO FULL VERSION