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 sichtbarDieses 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 ArrayEin 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