In diesem Beitrag wirst du lernen, was Methoden mit Rückgabewert sind. Dabei werden wir uns ansehen, was ein Rückgabewert ist und wie man eine Methode mit Rückgabewert in der Praxis selbst programmieren kann.
Inhaltsverzeichnis
1. Was ist ein Rückgabewert?
Ein Rückgabewert ist ein Wert, den eine Methode an ihren Aufrufer zurückgibt. Man kann diesen Rückgabewert demnach als Ergebnis der Methode ansehen. Stellen wir uns nun mal eine Methode mit einem Methodenblock vor, in dem etwas ausgeführt wird. Das, was darin beispielsweise berechnet oder an Strings zusammengesetzt wird, kann als Rückgabewert an den Aufrufer der Methode zurückgegeben werden.
Da das noch ziemlich abstrakt klingt, sehen wir uns das Thema mal in der Praxis an.
2. Die Methode ohne Rückgabewert
Auf der folgenden Abbildung ist das Beispiel des vorherigen Beitrags geöffnet:
Dort ist unsere doSomething-Methode, die keinen Rückgabewert besitzt. Das kann man am Schlüsselwort „void“ erkennen, welches für die Abwesenheit eines Rückgabewertes steht.
Wir übergeben dieser Methode zwei Parameter vom Typ Integer und das Programm lädt diese in die Variablen int x und int y. Anschließend rechnet es die Werte der Variablen zusammen, speichert diese in result und gibt das Ergebnis dann auf der Konsole aus.
Im nächsten Schritt werden wir die Methode noch etwas verkürzen. Da das Programm die Werte 20 und 20 direkt in die Variablen number1 und number2 lädt, ist es nicht notwendig, diese in den Variablen x und y zwischenzuspeichern. Das heißt, wir können die beiden Zeilen löschen und das x durch number1 sowie das y durch number2 ersetzen.
public static void doSomething(int number1, int number2) {
int result = number1 + number2;
System.out.println(result);
}
Damit sparen wir uns schon mal eine Zeile Code. Alternativ könnten wir auch number1 und number2 direkt in die println-Methode kopieren, anstatt das Ergebnis in result zu speichern. In diesem Fall würde tatsächlich nur eine Zeile Code genügen, um das Ganze auszuführen. Wir lassen den Code jetzt allerdings so stehen, wie er aktuell ist.
Momentan geschieht darin folgendes:
Wir übergeben die Werte, das Programm rechnet das Ergebnis zusammen und gibt es dann auf der Konsole aus.
Doch was ist, wenn wir das Ergebnis, das die doSomething-Methode liefert, in der Main-Methode noch mal benötigen?
Wenn wir unsere Methode in der Main-Methode aufrufen und wir mit dem Ergebnis, das zurückgegeben wird, an dieser Stelle weiterarbeiten möchten, kommen Rückgabewerte ins Spiel.
3. Methoden mit Rückgabewert
Im Prinzip ist es gar nicht mal so kompliziert, was wir hierfür noch ergänzen müssen. Zuerst ändern wir void in den Datentyp um, den unsere Methode zurückgeben soll. Aktuell rechnen wir zwei Integerwerte zusammen und geben das Ergebnis result auf der Konsole aus. Da das Ergebnis result also ein Integerwert ist und wir dieses von der Methode zurückgeben lassen möchten, schreiben wir anstelle von void int:
public static int doSomething(int number1, int number2) {
int result = number1 + number2;
System.out.println(result);
}
Damit weiß der Computer, dass diese Methode einen Rückgabewert vom Typ Integer zurückgeben wird. Allerdings ist im Moment noch eine Fehlermeldung zu sehen:
Das Schlüsselwort return
Der Grund dafür liegt darin, dass wir noch nichts zurückgeben. An dieser Stelle löschen wir zunächst die Zeile mit der println-Methode:
public static int doSomething(int number1, int number2) {
int result = number1 + number2;
System.out.println(result);
}
public static int doSomething(int number1, int number2) {
int result = number1 + number2;
}
Stattdessen werden wir von unserer Methode den Wert der Variable result zurückgeben lassen. Dazu verwenden wir das Schlüsselwort return.
Wenn wir nach return noch das Wort result ergänzen, ist die Fehlermeldung auch schon verschwunden und das Programm gibt den Wert result zurück:
public static int doSomething(int number1, int number2) {
int result = number1 + number2;
return result;
}
Führen wir das Programm nun aus, sehen wir allerdings erst mal nichts in der Konsole:
Doch woran liegt das und was geschieht hier überhaupt? Wir rufen die doSomething-Methode auf und übergeben die Werte 20 und 20, die das Programm jeweils in die Variablen number1 und number2 lädt. Anschließend rechnet es die beiden Werte zusammen, speichert das Ergebnis in result und gibt dieses zurück.
Dadurch, dass wir result zurückgeben, kommt das Ergebnis darin an der Stelle im Programm an, an der wir die Methode aufrufen. Doch momentan verarbeiten wir dieses Ergebnis noch nicht.
Das heißt, es erreicht zwar den Methodenaufruf, allerdings stellen wir damit nichts an.
Wir könnten den Code in der Main-Methode also umschreiben, indem wir stattdessen eine println-Methode verwenden und innerhalb dieser unsere doSomething-Methode aufrufen:
public static void main(String[] args) {
System.out.println("Vor dem Methodenaufruf!");
System.out.println(doSomething(20, 20));
System.out.println("Nach dem Methodenaufruf!");
}
Es funktioniert nämlich tatsächlich, dass wir innerhalb der println-Methode eine weitere Methode aufrufen. Schließlich wird uns darin ein Wert vom Typ Integer zurückgeliefert und diesen können wir auf der Konsole ausgeben.
Wenn wir das Ganze jetzt also nochmal speichern und ausführen, sehen wir das Ergebnis auf der Konsole:
4. Mit dem Rückgabewert weiterarbeiten
Was auch sein kann ist, dass man den von der doSomething-Methode zurückgegebenen Wert nicht direkt auf der Konsole ausgeben, sondern ihn dauerhaft in der Main-Methode speichern möchte.
Hierzu legen wir eine Variable namens resultFromMethodDoSomething an, der wir den Wert zuweisen können, den wir von der Methode zurückerhalten. Wir rufen dafür einfach die Methode doSomething() auf und müssen dieser noch Werte übergeben. Beispielhaft legen wir dafür 30 und 50 fest:
public static void main(String[] args) {
System.out.println("Vor dem Methodenaufruf!");
int resultFromMethodDoSomething = doSomething(30, 50);
System.out.println("Nach dem Methodenaufruf!");
}
Mit dieser Zeile Code rufen wir also die Methode auf, wodurch das Programm 30 und 50 zusammenrechnet, was in 80 resultiert. Dieser Wert wird dann der Variable resultFromMethodDoSomething zugewiesen, mit welcher wir anschließend weiterarbeiten können.
Zum Beispiel können wir diese Variable auf der Konsole ausgeben:
public static void main(String[] args) {
System.out.println("Vor dem Methodenaufruf!");
int resultFromMethodDoSomething = doSomething(30, 50);
System.out.println(resultFromMethodDoSomething);
System.out.println("Nach dem Methodenaufruf!");
}
Wie wir sehen, erhalten wir 80 in der Konsole:
Natürlich kann man nun auch wie gewohnt mit dieser Variable innerhalb des Codeblocks der Main-Methode arbeiten.
Verschiedene Datentypen für Methoden mit Rückgabewert
Das, was wir in der Methodendefinition mit dem Typ Integer gemacht haben, können wir jetzt mit jedem Datentyp umsetzen:
public static int doSomething(int number1, int number2) {
Anstelle von int wäre es demnach auch möglich, „double“ oder „String“ anzugeben. Die Methode müssen wir dann nur so anpassen, dass bei return sichergestellt ist, dass der zurückgegebene Wert dem jeweiligen Datentyp entspricht.
Wir können an dieser Stelle den Code der doSomething-Methode noch etwas verkürzen, ohne einen Wert in result zwischenspeichern zu müssen. Da wir den Wert ohnehin zurückgeben, können wir den Ausdruck direkt nach return angeben, wodurch wir die Möglichkeit haben, Ausdrücke gleich zurückzugeben:
public static int doSomething(int number1, int number2) {
return number1 + number2;
}
Das heißt, das Programm wertet zuerst den Ausdruck aus, wodurch wir das Ergebnis erhalten. Dieses wird anschließend zurückgegeben und beim Speichern und Ausführen des Programms sehen wir dann die gleiche Ausgabe in der Konsole: