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:

  1. Entwickeln Sie für einen selbst gewählten Prozess (z.B. den Ablauf des Kochwaschgangs in einer Waschmaschine) einen Satz von Methoden, die sie an untergeordnete Funktionseinheiten delegieren. Beispiel: missWasserstand() dreheTrommel(),...