dh-Materialien
Java Tutorial
 

Methoden

Definition von Methoden   Überladen von Methoden   Sichtbarkeit von Methoden   Konstruktoren   Aufruf von Methoden   Statische Methoden

Der Aufruf der Methode eines Objektes obj dient zum Beispiel dazu, den Inhalt von Attributen dieses Objektes zu erhalten und diese Inhalte (außerhalb oder innerhalb) von obj zu verarbeiten oder etwa dazu, obj zu einem bestimmten Verhalten zu veranlassen.

Definition von Methoden

Jede Methode wird immer innerhalb einer Klasse definiert, und zwar entweder als mit dem Modifikator static deklarierte Klassenmethode (die nur über die Klasse aufgerufen werden kann und zu keiner Instanz der Klasse gehört) oder als Instanzmethode (die nach der Instanziierung automatisch zu jeder der Instanzen der jeweiligen Klasse gehört).

Eine Methode kann so definiert werden, dass ihr beim Aufruf ein oder auch mehrere Eingabeparameter übergeben werden. In jedem Fall muss bei der Definition einer Methode sowohl der Typ der einzelnen Parameter als auch der Rückgabetyp angegeben werden:

// eine Klassenmethode:
static typ_r doABC(typ_a a, typ_b b, ...) {
    ...
}
// eine Instanzmethode:
typ_s doXYZ(typ_c c, typ_d d, ...) {
    ...
}

typ_r, typ_a, typ_b, ... sind hier Platzhalter, und zwar entweder Namen von elementaren Datentypen wie int, float, char u.a. oder für Referenztypnamen wie zum Beispiel String, JPanel, int[] u.s.f. (vgl. Variablentypen). Soll eine Methode definiert werden, die bei ihrem Aufruf nichts zurückliefert, dann ist für typ_r bzw. typ_s das Schlüsselwort void einzusetzen. Drei Beispiele:

int addNumbers(int m, int n) {
    return m + n;
}

String str1 = "abc";
String str2 = str1.concat("def");

void close() {
    System.exit(0);
}

addNumbers(3, 4) liefert den Rückgabewert 7; der Rückgabewert der vordefinierten Methode concat ist im obigen Beispiel die Zeichenkette "abcdef"; close() schließt ein ggf. geöffnetes Fenster, beendet das laufende Java-Programm und deaktiviert die JVM, falls diese nicht mehr benötigt wird.

Ist ein Eingabeparameter einer Methode eine primitive Variable, so wird der Methode eine Kopie des momentanen Variablenwertes übergeben (call by value); ist der Eingabeparameter eine Referenzvariable, so wird eine Kopie des Referenzwertes übergeben (call by reference) ( Javaprojekt CallDemo).

Überladen von Methoden

Es ist möglich, unterschiedliche Methoden mit demselben Namen zu definieren. Mit anderen Worten: Methoden können überladen werden. Die namensgleichen Methoden müssen sich hierbei durch die Anzahl oder/und die Typen ihrer Parameter voneinander unterscheiden. Beispielsweise ist die Methode abs der Klasse Math vierfach überladen:

double abs(double z)
float abs(float z)
int abs(int z)
long abs(long z)

Sichtbarkeit von Methoden

Mit den vorangestellten Zugriffsmodifikatoren public, protected und private wird bestimmt, wie Methoden verwendet werden dürfen:

public: Die Methode kann von überall aufgerufen werden.
protected: Die Methode darf nur innerhalb der jeweiligen Klasse oder von abgeleiteten Klassen verwendet werden.
private: Die Methode kann nur innerhalb der jeweiligen Klasse verwendet werden.

Ist dem Namen einer Methode kein Modifikator vorangestellt, so kann auf diese Methode nur aus Klassen zugegriffen werden, die sich im selben Paket befinden.

Sichtbarkeit von Methoden 

Durch die Kapselung (encapsulation) der Methoden eines Objekts infolge einschränkender Zugriffsmodifikatoren innerhalb der jeweiligen Klasse kann der direkte Zugriff von „außerhalb“ auf diese Methoden unterbunden werden. Beispielsweise stehen mit der Klasse Turtle die öffentlichen Methoden goInACircleToTheRight und goInACircleToTheLeft zur Verfügung, deren Funktionalität im Wesentlichen durch die private Methode goInACircle gewährleistet ist. Auf diese Weise kann zwischen der Verwendung der Methode eines Objektes („Wozu dient sie?“) und ihrer geschützten Implementierung („Wie funktioniert sie?“) streng unterschieden werden (vgl. Kapselung der Daten eines Objektes).

Konstruktoren

Konstruktoren sind spezielle Methoden einer nichtstatischen Klasse, mit deren Hilfe Instanzen dieser Klasse hergestellt werden können (vgl. Nichtstatische Klassen). Ein Konstruktorname muss mit dem jeweiligen Klassennamen identisch sein.

Ist beispielsweise Example eine nichtstatische Klasse, so besitzt diese bereits automatisch den Konstruktor Example(), auch ohne dass diese Methode explizit definiert wurde. Allerdings können dieser Methode bei Bedarf zusätzliche Anweisungen hinzugefügt werden ( Javaprojekt NoActions):

class Example {
    // Variablen
    // Objekte
    ...
    public Example() {
       ...
    }
    // weitere Methoden
    ...
}

Es besteht die Möglichkeit, neben dem parameterfreien Konstruktor Example() gegebenenfalls parametrisierte Konstruktoren zu definieren:

class Example {
    ...
    public Example() {
       ...
    }
    public Example(typa a, typb b, ...) {
       ...
    }
    ...
}

Ein Konstruktor liefert trotz fehlender return-Anweisung automatisch eine Referenz auf das durch ihn erzeugte Objekt zurück.

Aufruf von Methoden

Ist etwa doSomething() eine zum Objekt obj gehörende Methode, wird diese wie folgt aufgerufen:

obj.doSomething();

Ist obj eine Instanz einer Klasse, die zu einem vordefinierten Java-Paket gehört, so muss diese Klasse mittels einer import-Anweisung in das Javaprojekt explizit integriert werden (es sei denn, dass die Klasse zum Paket java.lang gehört). Ist obj beispielsweise vom Typ JFrame, so wird die Klasse JFrame mit der Programmzeile

import javax.swing.JFrame;

zum Javaprojekt hinzugefügt.

Statische Methoden

Statische Methoden einer Klasse (auch Klassenmethoden genannt) - also mit dem Schlüsselwort static deklarierte Methoden - können nicht von einer Klasseninstanz aufgerufen werden, sondern nur über die Klasse selbst. Beispielsweise sind alle Methoden der Klasse Math statische Methoden. Statische Methodennamen werden im Editor der Eclipse-IDE kursiv dargestellt. Ein Beispiel:

double z = Math.sqrt(13.7);

Die Methode main, die in einer Klasse jedes Javaprogramms implementiert werden muss, ist eine öffentliche (public) und eine statische (static) Methode sowie eine Methode, die beim Aufruf nichts zurückliefert (void) ( Javaprojekt HelloWorld):

public static void main(String[] args);