4.7.1 | Deklaration von Methoden |
Methoden haben einen Kopf und einen Rumpf. Ein Methodenkopf besteht in Java grundsätzlich aus:Die Kombination aus Bezeichner, Rückgabewert und Parametertypen nennt man auch die Signatur einer Methode. Eine Klasse darf keine zwei Methoden mit identischer Signatur haben.
- einem Ergebnistyp. Für die Fälle, in denen eine Methode keinen Ergebniswert hat, ist der Ergebnistyp void definiert. Er signalisiert, dass kein Ergebnis zurückgeliefert wird. Ein häufiger Anwendungsfall von void sind Methoden, mit denen lediglich ein Wert eingestellt wird:
void setX(int x) { this.x = x; }- einem Bezeichner. Er darf in Java alle Unicode-Zeichen und daher auch Umlaute und nationale Sonderzeichen enthalten.
- einer Parameterliste. Die Parameterliste wird durch ein Paar runder Klammern begrenzt. Bei Methoden, die keine Parameter besitzen, muss die leere Parameterliste () angegeben werden. Die in C übliche Notation (void) für leere Parameterlisten gibt es in Java nicht. Weiterhin gibt es in Java keine Analogie zur ",..."-Schreibweise von C, mit der eine variable Parameterliste vereinbart werden kann. Es ist dagegen möglich, verschiedene Varianten einer Methode mit unterschiedlichen formalen Parametern zu vereinbaren. Die Anzahl der Parameter wird aber für jede Variante genau festgelegt. Die Parameter werden in Java grundsätzlich analog zum ANSI-C-Standard deklariert, d. h., die Typen werden wie im obigen Beispiel bereits im Kopf angegeben. Der in C ebenfalls bekannte Kernighan-Ritchie-Standard wird in Java nicht unterstützt:
void setX(x) int x; // nicht unterstützt { this.x = x; }
In Java werden Parameter grundsätzlich als Wert übergeben (call by value). Das gilt auch für Objektreferenzen, d. h., wenn in einer Methode eine übergebene Objektreferenz verändert wird (z. B. Zuweisung von null), wirkt sich das nicht auf die Referenz aus, die der Aufrufer der Methode hält.
Der Rumpf folgt dem Methodenkopf und wird wie jeder Programmblock in Java in geschweiften Klammern eingefasst. Es ist nicht zulässig, in einer Methode eine Unterfunktion im Sinne der Sprache Pascal einzuschachteln. Es ist seit Version 1.1 dagegen möglich, in einer Methode eine lokale Klasse zu vereinbaren.
Die Klasse Point besitzt die beiden Methoden moveTo() und moveRel(), die den Punkt absolut oder relativ verschieben.public void moveTo(int x, int y) { this.x = x; this.y = y; } public void moveRel(int dx, int dy) { x += dx; y += dy; }Hier verfügen beide Methoden über Parameter, die dem Objekt näher mitteilen, wie es sich beim Aufruf der Methode zu verhalten hat. Natürlich ist es auch möglich, Methoden ohne Parameter zu definieren. Es wäre beispielsweise denkbar, der Klasse Point eine Methode hinzuzufügen, die den Punkt an den Ursprung verschiebt:public void toOrigin() { moveTo(0, 0); }Analog zu den Konstruktoren ist es bei Methoden möglich, dass eine Klasse mehrere Varianten derselben Methode besitzt. Dieser Vorgang wird Überladen genannt und ist im Abschnitt 4.7.4 näher beschrieben.
Seit Version 1.1 kann ein Methodenparameter als konstant vereinbart werden, indem der Modifier final vorangestellt wird. Dies hat zur Folge, dass der Compiler an allen Stellen einen Fehler meldet, an denen der Parameter auf der linken Seite einer Zuweisung steht.
Bei Objektreferenzen ist zu beachten, dass final lediglich bewirkt, dass die übergebene Referenz nicht verändert werden darf. Der Zustand des referenzierten Objekts dagegen kann sehr wohl geändert werden. Unter Verwendung von final könnte man die Methode moveTo auch folgendermaßen vereinbaren:public void moveTo(final int x, final int y) { this.x = x; this.y = y; }