Parameter und return
Kurz gesagt: Ein Parameter ist eine Variable der Methode, die den Wert aus dem Aufruf (das Argument) bekommt, und return gibt ein Ergebnis an den Aufrufer zurück.
Problem
Ein Bon, verschiedene Summen
Du willst eine Methode, die die letzte Zeile des Bons ausgibt: „Summe: … €“. Aber die Summe ist bei jeder Bestellung anders.
Die Methoden aus der letzten Lektion geben immer dasselbe aus. Eine Methode printTotal() kann die Summe nicht kennen. Eine eigene Methode für jede Summe willst du auch nicht. Du brauchst einen Weg, der Methode die Summe beim Aufruf zu übergeben.
Die Idee
Parameter: was die Methode bekommt
In den Klammern deklarierst du, was die Methode erwartet: einen Typ und einen Namen. Das ist ein Parameter. In der Methode ist er eine ganz normale Variable.
Beim Aufruf schreibst du den Wert in die Klammern. Dieser Wert heißt Argument.
static void printTotal(double total) { System.out.println("Summe: " + total + " €");}
printTotal(12.5);printTotal(4.2);Summe: 12.5 €Summe: 4.2 €double total ist der Parameter. 12.5 und 4.2 sind die Argumente. Es gibt eine Methode, und sie gibt verschiedene Summen aus.
Gibt es mehrere Parameter, trennst du sie mit Kommas. Die Argumente werden in derselben Reihenfolge übergeben.
Probier es aus
Nach Position, nicht nach Name
Was gibt das Programm aus?
static void printLine(String item, int qty) { System.out.println(item + ": " + qty + " Stk.");}
String coffee = "Kaffee";int qty = 3;printLine(coffee, 2);Argumente werden den Parametern nach Position zugeordnet: das erste item, das zweite qty. Die Variable qty draußen hat nichts mit dem Parameter qty zu tun, obwohl sie gleich heißen.
Problem
Warum ist der Preis nicht gesunken?
Du hast eine Methode für 10 % Rabatt geschrieben und sie aufgerufen:
static void applyDiscount(double price) { price = price * 0.9;}
double price = 100;applyDiscount(price);System.out.println(price); // 100.0100.0Der Preis ist immer noch 100. Die Methode meldet keinen Fehler, und trotzdem ist der Rabatt nicht da. Wo ist er geblieben?
Sieh es dir an
Die Methode bekommt eine Kopie
static void applyDiscount(double price) { price = price * 0.9;}
double price = 100;applyDiscount(price);System.out.println(price); // 100.0Schritt für Schritt, in Worten
- In main gibt es eine Variable price = 100.
- Du rufst applyDiscount(price) auf: Für die Methode wird neuer Speicher bereitgestellt.
- Der Wert wird in ihren Parameter price kopiert.
- Die Methode senkt ihre Kopie: 100 * 0.9 = 90.
- Die Methode endet, und ihr Speicher verschwindet, zusammen mit der Kopie.
- Und price in main ist immer noch 100.
Beim Aufruf bekommt die Methode nicht die Variable price selbst, sondern eine Kopie ihres Werts. Sie senkt die Kopie. Wenn die Methode endet, verschwindet ihr Speicher und mit ihm die Kopie. Das nennt man Wertübergabe (pass by value).
Die beiden Variablen heißen absichtlich gleich (price): Genau das verwirrt in der Praxis. Der Name spielt keine Rolle. Jede Methode hat ihre eigenen Variablen.
Die Idee
return: Die Methode gibt ein Ergebnis zurück
Die Lösung: Die Methode gibt den neuen Preis zurück. Vor den Namen schreibst du statt void den Typ des Ergebnisses (double), und in den Rumpf return und den Wert.
static double applyDiscount(double price) { return price * 0.9;}
double price = 100;price = applyDiscount(price);System.out.println(price); // 90.0Schritt für Schritt, in Worten
- In main: price = 100.
- Du rufst applyDiscount(price) auf: Für die Methode wird Speicher bereitgestellt.
- Der Wert wird in den Parameter price kopiert.
- return price * 0.9: Das Ergebnis ist 90.
- Das Ergebnis geht zurück an main und wird in price gespeichert.
- Jetzt ist price in main 90.
Der Aufruf applyDiscount(price) ist jetzt ein Wert. Du kannst ihn in einer Variable speichern (wie hier), ausgeben oder mit ihm rechnen.
Genauer, für Neugierige
- In einer
void-Methode kannst du auchreturn;(ohne Wert) schreiben. Es beendet einfach die Methode.
- In Java werden Argumente immer als Wert übergeben. Bei Objekten (Modul „Klassen und Objekte“) wird der Verweis auf das Objekt kopiert, deshalb sind Änderungen dort auch draußen zu sehen. Das sehen wir dann.
Probier es aus
Was ist das Ergebnis?
Die Methode berechnet 20 % Mehrwertsteuer auf den Preis. Welcher Typ gehört in die Lücke?
static vat(double price) {
return price * 0.2;
}price * 0.2 ist eine Dezimalzahl, also ist das Ergebnis double.Probier es aus
Zurückgegeben, aber verloren
Was gibt das Programm aus?
static int reserve(int seats) { seats = seats - 2; System.out.println("drinnen: " + seats); return seats;}
int seats = 10;reserve(seats);System.out.println("draußen: " + seats);Die Methode ändert ihre Kopie und gibt 8 zurück, aber niemand speichert das Ergebnis. Um es zu behalten, brauchst du seats = reserve(seats);.
Die Idee
return beendet die Methode
Der Shop berechnet für Bestellungen ab 50 € keine Lieferung. Sonst kostet die Lieferung 4,99 €:
static double shippingCost(double total) { if (total >= 50) { return 0; } return 4.99;}
System.out.println(shippingCost(62.0));System.out.println(shippingCost(18.5));0.04.99Sobald return erreicht ist, endet die Methode sofort. Deshalb läuft bei 62 € das zweite return nicht, und wir brauchen kein else.
Eine Methode mit Ergebnis muss auf jedem Weg einen Wert zurückgeben. Entfernst du die letzte Zeile, lässt sich das Programm nicht kompilieren: „missing return statement“.
Probier es aus
Finde den Fehler
Clubmitglieder bekommen 10 % Rabatt, alle anderen zahlen den vollen Preis. Aber alle bekommen den Rabatt. In welcher Zeile ist der Fehler?
Wähle die Zeile mit dem Fehler.
Das letzte return ist für alle, die keine Mitglieder sind: Sie zahlen den vollen Preis, return price;.
Übung
Methoden, die rechnen
Löse die Aufgaben in deinem Editor. Jede Methode bekommt, was sie braucht, als Parameter und gibt das Ergebnis zurück. Die Ausgabe passiert in main.
1. Durchschnitt. Die Methode average(int[] values) gibt den Durchschnitt der Zahlen im Array zurück. Lies in main von der Tastatur ein, wie viele Zahlen es gibt, und dann die Zahlen selbst.
51015202530Durchschnitt: 20.02. Primzahl. Die Methode isPrime(int n) gibt zurück, ob die Zahl eine Primzahl ist (nur durch 1 und durch sich selbst teilbar). Für 7 gibt sie true zurück, für 12 false.
3. Temperaturen. Die Methoden toFahrenheit(double c) und toCelsius(double f). F = C · 9 / 5 + 32. Lies eine Temperatur und eine Einheit (C oder F) ein und gib die umgerechnete aus.
100C100.0 C = 212.0 F4. Taschenrechner. Die Methode calculate(double a, double b, char op) gibt das Ergebnis für +, -, * oder / zurück. Die Rechenart wird mit if gewählt.
105+10.0 + 5.0 = 15.05. Ein Dreieck mit Parameter. Wir haben es in der letzten Lektion versprochen. Die Methode printTriangle(int height) gibt ein rechtwinkliges Dreieck aus Sternchen mit der Höhe height aus. Für 3:
** ** * *Genauer, für Neugierige
Pass auf 5 / 9 in der Formel für Celsius auf. Beide Zahlen sind ganze Zahlen, also ist die Division eine Ganzzahldivision, und das Ergebnis ist 0. Schreib (f - 32) * 5 / 9: Dann ist f - 32 ein double, und die ganze Rechnung läuft mit Dezimalzahlen.
Übung
Methoden für Arrays
Jede Aufgabe ist eine Methode, die ein Array (oder ein Wort) bekommt und ein Ergebnis zurückgibt. Am Ende setzt du alle zu einem Programm zusammen.
sum,sumEvenundsumOdd: die Summe aller Zahlen, der geraden und der ungeraden im Array.reverse: gibt ein neues Array mit den Zahlen in umgekehrter Reihenfolge zurück.maxundmin: die größte und die kleinste Zahl.isPalindrome(String word): ob das Wort vorwärts und rückwärts gleich gelesen wird.sumDiagonalsundsumDiagonalsOnce: die Summe entlang beider Diagonalen einer quadratischen Matrix, wobei das mittlere Element zweimal bzw. einmal gezählt wird.- Alles zusammen: für das Array
{ 1, 2, 3, 4, 5 }, die Zahl 7 (mitisPrimeaus der Karte darüber), die Wörter „neben“ und „ABCDE“ und die 3 × 3-Matrix mit den Zahlen von 1 bis 9.
Summe: 15, Gerade: 6, Ungerade: 9Umgekehrt: [5, 4, 3, 2, 1]Max: 5, Min: 17 ist eine Primzahl: trueneben: true, ABCDE: falseSumme mit Wiederholung: 30, Summe ohne Wiederholung: 25Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: Schleifen · Arrays · Zweidimensionale Arrays · Methoden
- Geht weiter in: Überladen · Rekursion · Klassen und Objekte · Konstruktoren und this
- Aufgaben zum Thema: Methoden