Abteilung Informatik, Fach Programmieren FHZ Hochschule für Technik+Architektur Luzern K08 METHODEN UND PARAMETER K08 METHODEN UND PARAMETER 1 Motivation und Einleitung Grosse Programme können hunderttausende von Zeilen umfassen. Software auf modernem Billettautomat: 500’000 Zeilen Code! Solche Programme müssen gut strukturiert werden, damit sie überhaupt noch verstanden werden können. Eines der wichtigsten Mittel um dies zu tun, ist das Zusammenfassen von Programmanweisungen, welche immer wieder gebraucht werden. Diesen wird dann ein eigener Name gegeben. Im Programm muss nur noch dieser Name geschrieben werden. Der Computer führt dann die dahinter stehenden Anweisungen selbständig aus. Dieses Konzept ist nicht neu. Schon in den Anfängen der Programmierung wurde es unter dem Begriff Subroutine eingeführt (siehe Assembler). Später wurde es zum Konzept der Prozeduren und Funktionen ausgebaut (strukturierte Programmierung). In der objektorientierten Programmierung wurde dieses Konzept schliesslich mit dem Konzept der Klassen und Objekte verbunden und so sind Methoden entstanden. Eine Methode ist nichts anderes, als ein Programmteil bestehend aus zusammengehörenden Anweisungen (vgl. Algorithmus, Struktogramm), welcher einer bestimmter Klasse zugeordnet ist. Ihre Ausführung ist immer an ein Objekt gebunden. Letzteres tritt in dieser Lektion allerdings nicht offen zu Tage. K08_Methoden-L, V14 © H. Diethelm Seite 1/13 Abteilung Informatik, Fach Programmieren FHZ Hochschule für Technik+Architektur Luzern K08 METHODEN UND PARAMETER Beispiel: Wir möchten ein gleichschenkliges Dreieck mit der Basisbreite 100 Pixel und der Höhe 50 Pixel an der Position (20, 200), entsprechend den Koordinaten der linken, unteren Ecke, auf den Bildschirm zeichnen. Wie sieht das entsprechende Programm aus? Führen Sie Variablen für die Basisbreite, die Höhe und die Koordinaten ein. import java.awt.*; import.java.applet.Applet; public class Triangle extends Applet { public void paint(Graphics g){ int basis = 100; int hoehe = 50; int x = 20; int y = 200; g.drawLine(x, y, x + basis, y); g.drawLine(x, y, x +(basis / 2), y - hoehe); g.drawLine(x + basis, y, x + (basis / 2), y - hoehe); } } K08_Methoden-L, V14 © H. Diethelm Seite 2/13 FHZ Hochschule für Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K08 METHODEN UND PARAMETER Wenn man nur die Zeilen zum Zeichnen der Linien anschaut, dann sind diese absolut unabhängig von den oben gegebenen Werten für Basisbreite, Höhe und Ort. Das heisst, wenn wir ein zweites Dreieck zeichnen wollten, müssten wir zuerst die Werte der Variablen ändern und dann die genau gleichen Zeilen nochmals hinschreiben. Beim dritten Dreieck ... Dies schreit förmlich nach einer Methode! Wir nennen die Methode drawTriangle(). Ein erster Versuch könnte so aussehen: import java.awt.*; import.java.applet.Applet; public class Triangle exends Applet { public void paint(Graphics g) { drawTriangle(g); } private void drawTriangle(Graphics g) { int basis = 100; int hoehe = 50; int x = 20; int y = 200; g.drawLine(x, y, x + basis, y); g.drawLine(x, y, x + basis/2, y - hoehe); g.drawLine(x + basis, y, x + basis/2, y - hoehe); } } Allerdings sind wir damit noch nicht viel weiter. Wir können zwar die Methode drawTriangle() beliebig viele Male aufrufen, aber sie zeichnet immer dasselbe Dreieck an derselben Stelle!! K08_Methoden-L, V14 © H. Diethelm Seite 3/13 Abteilung Informatik, Fach Programmieren FHZ Hochschule für Technik+Architektur Luzern K08 METHODEN UND PARAMETER 2 Methoden mit Parametern Unser Problem ist, dass wir den Variablen in der Methode drawTriangle() beim Aufruf keine neuen Werte zuweisen können. Die Lösung für dieses Problem heisst Parameter. Statt Basisbreite, Höhe etc. als Variablen innerhalb der Methode zu deklarieren verschieben wir diese in den Kopf der Methode: private void drawTriangle(Graphics g, int basis, int hoehe, int x, int y) { g.drawLine(x, y, x + basis, y); g.drawLine(x, y, x + basis/2, y - hoehe); g.drawLine(x + basis, y, x + basis/2, y - hoehe); } g, basis, hoehe, x und y sind jetzt Parameter, genauer formale Parameter, der Methode drawTriangle(). Sie erhalten ihre Werte bei jedem Aufruf neu: drawTriangle(g, 100, 50, 20, 200); drawTriangle(g, 40, 80, 100, 150); Die Werte 100, 50, etc. werden als aktuelle Parameter bezeichnet. Sie werden beim Aufruf in der Reihenfolge ihres Auftretens den formalen Parametern zugewiesen. Es muss für jeden formalen Parameter ein passender aktueller Parameter, in der richtigen Reihenfolge vorhanden sein. K08_Methoden-L, V14 © H. Diethelm Seite 4/13 Abteilung Informatik, Fach Programmieren FHZ Hochschule für Technik+Architektur Luzern K08 METHODEN UND PARAMETER Noch ein Wort zu g: In der Methode drawTriangle() ist g ein formaler Parameter. In der Methode paint(), ist g auch ein formaler Parameter. Es handelt sich aber um zwei verschiedene Parameter! Der Appletviewer ruft beim Darstellen des Applets die Methode paint() auf und weist g einen entsprechenden aktuellen Parameter zu. Es handelt sich dabei um ein Objekt der Klasse Graphics, welches den Bildschirmausschnitt repräsentiert, auf welchen wir zeichnen wollen. Dieses Objekt wird von der Methode paint() an die Methode drawTriangle() weitergereicht. K08_Methoden-L, V14 © H. Diethelm Seite 5/13 FHZ Hochschule für Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K08 METHODEN UND PARAMETER Beispiel: Schreiben Sie eine Methode, welche einen Stern in der folgenden Art zeichnet: (x, y) width g, x, y und width sind Parameter der Methode. private void drawStar(Graphics g, int x, int y, int width) { g.drawLine(x - width, y, x + width, y); g.drawLine(x, y + width, x, y - width; g.drawLine(x - width, y - width, x + width, y + width); g.drawLine(x + width, y - width, x - width, y + width); } K08_Methoden-L, V14 © H. Diethelm Seite 6/13 Abteilung Informatik, Fach Programmieren FHZ Hochschule für Technik+Architektur Luzern K08 METHODEN UND PARAMETER 3 Lokale Variablen Variablen, welche innerhalb einer Methode deklariert sind, nennt man auch lokale Variablen. Diese Variablen existieren nur so lange, wie eine aufgerufene Methode aktiv ist. Lokale Variablen müssen initialisiert werden, bevor auf sie zugegriffen werden kann. 4 Die Sichtbarkeit von lokalen Variablen und Parametern Variablen und Parameter sind nur innerhalb der Methode sichtbar, in welcher sie deklariert wurden. Das heisst, man kann zwei Methoden haben, welche Parameter oder Variablen mit dem selben Namen deklarieren. Es entsteht kein Problem. Die geschweiften Klammern bilden einen Sichtbarkeitsbereich oder Scope. 5 Was ist die Bedeutung von public und private? Methoden sind immer innerhalb einer Klasse definiert. Beim Aufruf einer Methode unterscheiden wir, ob die Methode von ausserhalb der Klasse (von einem Objekt einer anderen Klasse) oder von innerhalb der Klasse (von einer anderen Methode der selben Klasse bzw. vom aktuellen Objekt) aufgerufen wird. Der erste Fall ist nur möglich, wenn die Methode als public deklariert wurde. Ist sie hingegen als private deklariert, so ist nur der zweite Fall möglich. Die Methode paint() wird vom Appletviewer, also von aussen aufgerufen, deshalb muss sie public sein. Die Methode drawTriangle() wird nur innerhalb der Klasse Triangle gebraucht. Deshalb kann sie private sein. K08_Methoden-L, V14 © H. Diethelm Seite 7/13 Abteilung Informatik, Fach Programmieren FHZ Hochschule für Technik+Architektur Luzern K08 METHODEN UND PARAMETER 6 Rückgabe eines Resultats Aus der Mathematik sind wir uns an Funktionen gewohnt, welche in Abhängigkeit von einem oder mehreren Werten irgend ein Resultat liefern. Beispiel: sin(Π/2) = 1 (Achtung kein Java!) Analog können wir in Java Methoden definieren, welche ein Resultat liefern. Beispiel: private int flaeche(int breite, int laenge) { int resultat = breite * laenge; return resultat; } Folgendes fällt sofort auf: § Vor der Methode steht int statt void. Damit wird ausgesagt, dass die Methode als Resultat einen Wert vom Typ int zurückgibt. (Entsprechend heisst void, die Methode gibt nichts zurück.) § Am Schluss der Methode steht return resultat. Damit wird der Wert von resultat zurückgegeben. K08_Methoden-L, V14 © H. Diethelm Seite 8/13 Abteilung Informatik, Fach Programmieren FHZ Hochschule für Technik+Architektur Luzern K08 METHODEN UND PARAMETER Die Methode kann wie folgt aufgerufen werden: int f = flaeche(20, 30); Eine Methode mit dem Typ int kann überall dort aufgerufen werden, wo auch ein einfacher Wert desselben Typs stehen könnte. Das heisst folgende Anweisung ist möglich: g.drawString("Flaeche = " + flaeche(20, 30), 20, 20); Auf der anderen Seite kann jeder Aufruf einer Methode mit einem von void verschiedenen Typ durch einen einfachen Wert desselben Typs ersetzt werden. Für die obige Anweisung könnte man also auch schreiben: int f = 600; Wichtige Bemerkungen: § Sobald in der Methode eine return-Anweisung steht, wird die Methode abgebrochen. Dass heisst, nachfolgende Anweisungen innerhalb der Methode werden nicht mehr ausgeführt. § Die letzte Anweisung in einer Methode mit Rückgabewert muss eine return-Anweisung sein! § Der Rückgabewert einer Methode darf ignoriert werden bzw. muss nicht zwingend "konsumiert" werden! Der Compiler lässt dies zu. K08_Methoden-L, V14 © H. Diethelm Seite 9/13 Abteilung Informatik, Fach Programmieren FHZ Hochschule für Technik+Architektur Luzern K08 METHODEN UND PARAMETER Abschlussbeispiel: Wir wollen unser Programm um eine Methode drawHouse() erweitern. Diese zeichnet ein Haus auf den Bildschirm: hoehe / 2 hoehe (x, y) breite Dazu brauchen wir eine Methode zum Zeichnen von Rechtecken. Anders als bei den Dreiecken, müssen wir diese Methode nicht selber implementieren. Statt dessen importieren wir sie aus der Klassenbibliothek java.awt.* (genaugenommen importieren wir die Klasse Graphics, welche diese Methode, wie auch die Methode drawString() etc. implementiert). import java.awt.*; import.java.applet.Applet; public class House extends Applet { public void paint(Graphics g){ drawHouse(g,160,20,100,80); } K08_Methoden-L, V14 © H. Diethelm Seite 10/13 FHZ Hochschule für Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren K08 METHODEN UND PARAMETER private void drawTriangle(Graphics g, int basis, int hoehe, int x, int y) { g.drawLine(x, y, x + basis, y); g.drawLine(x, y, x + (basis / 2), y - hoehe); g.drawLine(x + basis, y, x + (basis / 2), y - hoehe); } private void drawHouse(Graphics g, int breite, int hoehe, int x, int y) { g.drawRect(x, y - hoehe, breite, hoehe); drawTriangle(g, breite, hoehe / 2, x, y - hoehe); } } K08_Methoden-L, V14 © H. Diethelm Seite 11/13 Abteilung Informatik, Fach Programmieren FHZ Hochschule für Technik+Architektur Luzern K08 METHODEN UND PARAMETER Wichtige Bemerkungen: § In Java ist es zulässig, dass eine Methode bereits vor ihrer Deklaration aufgerufen werden kann, vgl. oben Aufruf von drawHouse(). § In Java ist es nicht zulässig, innerhalb bzw. lokal in einer Methode weitere Methoden zu deklarieren. Oben könnte man also die Methode drawTriangle() nicht innerhalb von drawHouse() deklarieren! K08_Methoden-L, V14 © H. Diethelm Seite 12/13 Abteilung Informatik, Fach Programmieren FHZ Hochschule für Technik+Architektur Luzern K08 METHODEN UND PARAMETER Der Ablauf beim Aufruf der Methode drawHouse() mit den Parametern 160, 20, 100, 50 sieht wie folgt aus: Sequenzdiagramm in UML-Notation (Unified Modeling Language): :House g:Graphics paint(g) drawHouse(g) drawRect() drawTriangle(g) drawLine() drawLine() drawLine() K08_Methoden-L, V14 © H. Diethelm Seite 13/13