EMZETT.
Login

Parameters

Kurz: Die Werte, die einer Methode beim Aufruf übergeben werden — im Methodenkopf mit Typ und Name deklariert, beim Aufruf mit konkreten Werten (“Argumenten”) befüllt.

Genauer: Java übergibt Parameter grundsätzlich “by value”: bei primitiven Typen wird eine Kopie des Werts übergeben, bei Objekten eine Kopie der Referenz — Feldänderungen am übergebenen Objekt wirken sich also nach außen aus, ein komplettes Neu-Zuweisen der Parametervariable innerhalb der Methode dagegen nicht.

Im Detail

void verdopple(int zahl) {
    zahl = zahl * 2; // ändert nur die LOKALE Kopie, nicht das Original des Aufrufers
}
 
int x = 5;
verdopple(x);
System.out.println(x); // immer noch 5 - unverändert!
 
void aendereFeld(Auto auto) {
    auto.farbe = "Rot"; // ändert das FELD des Objekts, auf das die Referenz zeigt
}
 
void neuesObjektZuweisen(Auto auto) {
    auto = new Auto("Blau"); // ändert nur die LOKALE Kopie der Referenz-Variable
}
 
Auto meinAuto = new Auto("Grün");
aendereFeld(meinAuto);
System.out.println(meinAuto.farbe); // "Rot" - Feldänderung IST sichtbar
neuesObjektZuweisen(meinAuto);
System.out.println(meinAuto.farbe); // immer noch "Rot" - Neuzuweisung war NICHT sichtbar

Dieses Verhalten (“Java ist immer by value, nie by reference”) ist eine der subtilsten Stellen der Sprache und Quelle vieler Missverständnisse: bei Objekten wird zwar eine KOPIE der Referenz übergeben — aber beide Kopien (Original und Parameter) zeigen auf dasselbe Objekt im Heap, weshalb Feldänderungen sichtbar bleiben. Weist man dem Parameter dagegen eine komplett NEUE Referenz zu (auto = new Auto(...)), betrifft das nur die lokale Kopie der Variable innerhalb der Methode — der Aufrufer sieht davon nichts, weil dessen eigene Variable weiterhin auf das ursprüngliche Objekt zeigt.

Varargs: variable Parameteranzahl

Java erlaubt Methoden mit einer variablen Anzahl an Parametern desselben Typs über die Varargs-Syntax (...) — intern wird das als Array behandelt, die Aufrufer-Syntax bleibt aber deutlich kompakter:

int summe(int... zahlen) { // beliebig viele int-Werte, auch null
    int gesamt = 0;
    for (int z : zahlen) gesamt += z;
    return gesamt;
}
 
summe();           // 0 - gültig, leeres Array
summe(1, 2, 3);     // 6
summe(new int[]{4, 5}); // funktioniert auch direkt mit einem Array

Ein Varargs-Parameter muss immer der LETZTE in der Parameterliste einer Methode sein, und eine Methode darf höchstens einen einzigen Varargs-Parameter haben — der Compiler würde sonst nicht eindeutig wissen, wo die variable Liste endet.

Parameter vs. Argument

Streng genommen bezeichnet “Parameter” die im Methodenkopf deklarierte Variable (void methode(int zahl) — zahl ist der Parameter), während “Argument” den konkreten Wert beim Aufruf meint (methode(5) — 5 ist das Argument). Im alltäglichen Sprachgebrauch werden beide Begriffe oft synonym verwendet, die Unterscheidung ist aber in Fachliteratur und Stack-Traces gebräuchlich.

Siehe auch: Methods, Overloading, Arrays