Statische Methoden (1)
Vielleicht kennen Sie aus anderen Programmiersprachen die Begriffe Prozedur und Funktion. Das sind Programmteile, die an mehreren Stellen benötigt werden und deshalb aus dem Hauptprogramm ausgegliedert wurden. Beiden gemeinsam ist, dass eine Folge von Befehlen unter einem Namen zusammengefasst wird. Der Unterschied liegt darin, dass Funktionen ein Resultat zurückgeben, Prozeduren nicht. Betrachten wir die morgendliche Tätigkeit einer Mutter von Zwillingen:
...
wickle(Kind1);
// Die Prozedur "wickle()" fasst einen Ablauf zusammen
wickle(Kind2);
// der auf verschiedene Objekte angewendet werden kann.
t1 = missTemperatur(Kind1); // Die Funktion missTemperatur()
umfasst einen Arbeitsablauf,
t2 = missTemperatur(Kind2); // der ein weiterverwendbares
Ergebnis zurückliefert
...
Im Vordergrund der Java-Denkweise stehen Objekte, auf die bestimmte Untersuchungs- und Behandlungsmethoden angewendet werden. Es ist jedoch auch möglich, innerhalb einer Java-Klasse statische Methoden zu definieren, die unabhängig von einem konkreten Objekt gelten. Diese kann man wie Prozeduren und Funktionen verwenden.
Auch wir haben statische Methoden bereits benutzt, etwa die Methode
main(), mit deren
Aufruf jedes Java-Programm startet.
Die Anweisung
System.out.println() ist eine statische Methode des Typs
Prozedur aus der Klasse System, Math.random();
ist eine Methode vom Typ Funktion aus der Klasse Math. Sobald wir im
Java-Editor einen Punkt hinter den Namen einer Klasse eintippen, nimmt
der Java-Editor an, dass wir uns nach den Methoden erkundigen, die auf
diese Klasse bezw. dieses Objekt angewendet werden können und schlägt
uns die für diese Klasse definierten Methoden vor:
Geben Sie im
Java-Editor ein a = Integer.p
Sie erhalten den Vorschlag, den Code folgendermaßen zu vervollständigen:
Das bedeutet: Die Klasse Integer stellt die Methode
parseInt() zur Verfügung,
die als Argument einen String annimmt und
als Resultat eine Integerzahl ausgibt.
Solche Methoden wollen wir nun selbst schreiben
Nehmen wir als Beispiel die etwas blödsinnige Prozedur
druckDoppelt(), deren Aufgabe es ist, das Doppelte einer Integerzahl auf
dem Bildschirm auszugeben und die Funktion Nachfolger, die zu einer gegebenen
ganzen Zahl die nächstgrößere ganze Zahl liefert:
public class IntMath {
static void druckDoppelt(int zahl) {
// Deklaration von druckDoppelt()
System.out.println("Das Doppelte von "+zahl+" ist "+2*zahl);
// (Prozedur)
}
static int nachfolger(int zahl) {
// Deklaration von nachfolger()
return zahl+1;
// (Funktion)
}
public static void main(String[] args) {
druckDoppelt(5);
// Aufruf der Prozedur
int z=3;
int n=nachfolger(z);
// Aufruf der Funktion
System.out.println("Der Nachfolger von "+z+" ist "+n);
druckDoppelt(n);
// Erneuter Aufruf der Prozedur
druckDoppelt(nachfolger(7));
}
}
Probieren Sie das Programm aus.
Versuchen Sie zunächst die Ausgabe vorherzusagen und arbeiten Sie es
anschließend am besten Schritt für Schritt ab.
Ergänzen Sie das Programm spaßeshalber noch um die Zeile
int m = IntMath.nachfolger(999);
Da wir uns innerhalb der Klasse IntMath befinden, brauchten wir den
Klassennamen eigentlich nicht anzugeben.
Tun wir es aber, so zeigt uns der Java-Editor, nachdem wird den Punkt
eingegeben haben, dass unsere Klasse uns drei Methoden zur Verfügung
stellt. In der Klammer nach dem Namen steht, welche Argumente die
Methode erwartet, hinter dem Doppelpunkt erfahren wir, welche Art von
Resultat sie liefert. Im Falle von Prozeduren ist das Resultat void
(leer).
Manchmal ist es sinnvoll, dass eine Funktion unter gleichem Namen
doppelt deklariert wird, etwa
static int quadrat(int eingabe)
static double quadrat(double eingabe)
Auf die Anweisung f = quadrat(m); hin sucht
sich dann Java abhängig davon,
ob m als integer oder als double deklariert ist, die richtige Variante
aus.
Aufgaben: