2. Unterprogramme und Methoden Methoden 2. Unterprogramme und Methoden 2. Unterprogramme und Methoden Methoden Parameterübergabe und -rückgabe • 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 • 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; Beispiel: mehrfache Auswertung der Funktion 2n f (x, n) = x 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 2 + n − nx return; Ein solches return als letze Anweisung kann auch entfallen. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 2. Unterprogramme und Methoden 38 Methoden Deklaration von (Klassen-)Methoden 2. Unterprogramme und Methoden 40 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: Syntax: public static double f(double x, int n) { double produkt = 1.0; public static Rückgabetyp Methodenname ( Parameterliste ) { Anweisungen } for (int i=0; i<2*n ; i++) produkt = produkt * x; • 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 Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 return produkt + n*n - n*x; } 39 Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 41 2. Unterprogramme und Methoden Methoden 2. Unterprogramme und Methoden Aufruf von Methoden Syntax: Methoden Referenzparameter 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; • 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! • 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 2. Unterprogramme und Methoden 42 Methoden Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 2. Unterprogramme und Methoden Wertparameter 44 Methoden Referenzparameter (2) Wertparameter ermöglichen die Übergabe von Variablenwerten, aber nicht deren Änderung. Was wird ausgegeben? public static void methode(int[] a) { a[0]++; } Was wird ausgegeben? public static void methode(int a) { a++; } public static void main(String[] args) { int[] a = { 1 }; public static void main(String[] args) { int a = 1; methode(a); System.out.println(a[0]); methode(a); System.out.println(a); } } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 43 Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 45 2. Unterprogramme und Methoden Methoden 2. Unterprogramme und Methoden Referenzparameter (3) 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. Was wird ausgegeben? public static void methode(int[] a) { a = new int[] { 2 }; } public class MeineKlasse { static String s = "Klassenvariable"; public static void meineMethode1() { System.out.println(s); } public static void main(String[] args) { int[] a = { 1 }; methode(a); System.out.println(a[0]); public static void meineMethode2() { System.out.println(s); } } } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 2. Unterprogramme und Methoden 46 Methoden Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 2. Unterprogramme und Methoden 48 Methoden • Solch eine Variable heißt Klassenvariable. Ü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; } • 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. public static double max(double x, double y) { return (x>y) ? x : y; } • Klassenvariablen können trotzdem angesprochen werden. Hierzu stellt man den Klassennamen vor den Variablennamen: Java unterscheidet Methoden gleichen Namens Klassenname.Variablenname • 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 Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 49 2. Unterprogramme und Methoden 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)); } } Methoden Die Methode main • Die Hauptmethode main ist nach dem gleichen Schema wie jede andere Methode aufgebaut. Ausgabe: a = 1000 b = 2 a = 3 b = 20 c = 3 m(c) = 100 Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 2. Unterprogramme und Methoden 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 50 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 2. Unterprogramme und Methoden 51 Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08 52