2. Unterprogramme und Methoden Methoden 2. Unterprogramme und Methoden • Durch Methoden wird ausführbarer Code unter einem Namen zusammengefasst. • Dieser Code kann unter Verwendung von sogenannten Parametern formuliert sein, denen später beim Aufruf der Methode Werte übergeben werden. • Methoden sind ein Bestandteil von Klassen. • Wir befassen uns hier mit einem Spezialfall (Klassenmethoden)! Später noch: Methoden in Verbindung mit Objekten Beispiel: mehrfache Auswertung der Funktion f (x, n) = x2n + n2 − nx Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 38 2. Unterprogramme und Methoden Methoden Deklaration von (Klassen-)Methoden Syntax: public static Rückgabetyp Methodenname ( Parameterliste ) { Anweisungen } • Rückgabetyp Datentyp des Ergebnisses, das die Methode zurückliefern soll. Soll die Methode keinen Wert zurückliefern, verwenden wir hier void. • Methodenname Bezeichner als Name für die Methode. • Parameterliste Eine Kommaliste von Variablendeklarationen. Die darin aufgeführten Variablen heißen formale Parameter. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 39 2. Unterprogramme und Methoden Methoden Parameterübergabe und -rückgabe • Der Methodenkopf für die Berechnung von f (x, n) = x2n + n2 − nx könnte lauten: public static double f(double x, int n) • Für die Ergebnisrückgabe an die aufrufende Umgebung steht die returnAnweisung zur Verfügung. • Durch return ergebnis; wird die Ausführung der Methode beendet und der Wert des Ausdrucks ergebnis als Resultat zurückgegeben. • Hat eine Methode den Rückgabetyp void, so reicht return; Ein solches return als letze Anweisung kann auch entfallen. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 40 2. Unterprogramme und Methoden Methoden • Eine Methode darf mehrere return-Anweisungen enthalten. Für Methoden, die nicht den Rückgabetyp void haben, muß aber sichergestellt sein, daß vor Beendigung der Methode eine return-Anweisung ausgeführt wird. • Beispielmethode komplett: public static double f(double x, int n) { double produkt = 1.0; for (int i=0; i<2*n ; i++) produkt = produkt * x; return produkt + n*n - n*x; } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 41 2. Unterprogramme und Methoden Methoden Aufruf von Methoden Syntax: Methodenname( Parameterliste ) • Ein Methodenaufruf ist ein elementarer Ausdruck. • Parameterliste ist eine Kommaliste von Ausdrücken (aktuelle Parameter). Die Werte der Ausdrücke werden über die formalen Parameter aus der Methodendeklaration an die Methode übergeben. • Nach dem Aufruf wird jeweils der entsprechende Rückgabewert für den ursprünglichen Methodenaufruf eingesetzt und mit diesem Wert weitergearbeitet. double y = f(x,n); double z = f(y,3) + 3*x; • In Java erfolgt die Parameterübergabe stets als Wertparameter (call by value). Es wird stets eine Kopie des Wertes einer Variablen an die Methode übergeben, der Wert der Variablen bleibt unverändert. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 42 2. Unterprogramme und Methoden Methoden Wertparameter Wertparameter ermöglichen die Übergabe von Variablenwerten, aber nicht deren Änderung. Was wird ausgegeben? public static void methode(int a) { a++; } public static void main(String[] args) { int a = 1; methode(a); System.out.println(a); } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 43 2. Unterprogramme und Methoden Methoden Referenzparameter • Referenzparameter ermöglichen nicht nur die Übergabe von Variablenwerten, sondern auch deren Änderung. • Referenzparameter gibt es z.B. in den folgenden Programmiersprachen: Pascal, Modula-2, C++ • Durch die Benutzung von Zeigern (Referenzen) kann ein den Referenzparametern ähnliches Verhalten simulieren. • Aber Vorsicht: Auch die Referenzen sind nur Wertparameter in Java! • Konsequenz: Nur die referenzierten Inhalte können geändert werden, nicht die Referenz selber! Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 44 2. Unterprogramme und Methoden Methoden Referenzparameter (2) Was wird ausgegeben? public static void methode(int[] a) { a[0]++; } public static void main(String[] args) { int[] a = { 1 }; methode(a); System.out.println(a[0]); } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 45 2. Unterprogramme und Methoden Methoden Referenzparameter (3) Was wird ausgegeben? public static void methode(int[] a) { a = new int[] { 2 }; } public static void main(String[] args) { int[] a = { 1 }; methode(a); System.out.println(a[0]); } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 46 2. Unterprogramme und Methoden Methoden Überladen von Methoden In Java darf es auch innerhalb einer Klasse mehrere Methoden mit dem gleichen Namen geben, d.h. Methoden können überladen werden: public static int max(int x, int y) { return (x>y) ? x : y; } public static double max(double x, double y) { return (x>y) ? x : y; } Java unterscheidet Methoden gleichen Namens • anhand der Zahl der Parameter, • anhand des Typs Typs der Parameter und • anhand der Position der Parameter. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 47 2. Unterprogramme und Methoden Methoden Sichtbarkeit und Verdecken von Variablen • Manchmal möchte man eine Variable deklarieren, die in mehr als einer Methode (einer Klasse) bekannt ist. • Wir erreichen dies, indem wir die Variable ausserhalb aller Methoden, aber innerhalb einer Klasse definieren und static davor schreiben. public class MeineKlasse { static String s = "Klassenvariable"; public static void meineMethode1() { System.out.println(s); } public static void meineMethode2() { System.out.println(s); } } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 48 2. Unterprogramme und Methoden Methoden • Solch eine Variable heißt Klassenvariable. • Java erlaubt es aber auch, daß Klassenvariablen und lokale Variablen bzw. Klassenvariablen und formale Parameter den gleichen Namen tragen. • Wenn dies so ist, welche Variable wird dann genommen? • Grundregel für die Sichtbarkeit bzw. das Verdecken: Innerhalb von Methoden verdecken lokale Variablen und formale Parameter die Klassenvariablen gleichen Namens. • Klassenvariablen können trotzdem angesprochen werden. Hierzu stellt man den Klassennamen vor den Variablennamen: Klassenname.Variablenname Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 49 2. Unterprogramme und Methoden public class VerdeckenTest { static int a=1, b=2, c=3; static int m(int a) { int b=20; System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); return 100; } public static void main(String[] args) { int a=1000; System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("m(c) = " + m(c)); } } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 Methoden Ausgabe: a = 1000 b = 2 a = 3 b = 20 c = 3 m(c) = 100 50 2. Unterprogramme und Methoden Methoden Rekursive Methoden Rekursion ist in Java erlaubt, d.h. Methoden dürfen sich selbst aufrufen! Beispiel: Methode zur Berechnung der Fibonacci-Zahlen Fi : F0 = 0, F1 = 1, Fn = Fn−1 + Fn−2 für n ≥ 2 static int fibonacci(int n) { if ( n == 0 ) return 0; if ( n == 1 ) return 1; return fibonacci(n-1) + fibonacci(n-2); } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 51 2. Unterprogramme und Methoden Methoden Die Methode main • Die Hauptmethode main ist nach dem gleichen Schema wie jede andere Methode aufgebaut. public static void main(String[] args) • Der Inhalt von args ergibt sich durch die Argumente, die beim Aufruf des Programms angegeben werden. • Beim Aufruf von > java MeineKlasse Argument1 ... ArgumentN gilt für args in main von MeineKlasse: – args.length hat den Wert N – args[0] hat den Wert Argument1 als String – args[args.length-1] hat den Wert ArgumentN als String Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 52