Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Gerhard Gröger, Dipl.-Ing. Dirk Dörschlag Einführung in die Programmierung mit Java 6. Vorlesung WS 2003/2004 Übersicht • Methoden – – – – – – Deklaration Aufruf Parameterübergabe Rückgabewert Lokale Variablen Konstruktoren G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 2 Hausaufgabe • Entwerft analog zur Definition von Rechtecken die Klassendefinitionen für Dreiecke, Ellipsen und Trapeze. Erzeugt mindestens eine Instanz jeder Klasse und weist ihnen sinnvolle Werte zu. • Hinweis: Die Lösung umfasst mehrere .java-Dateien. In jedem der Dateinamen (und auch Klassennamen) muss Euer Nachname auftauchen (z.B. SchmitzDreieck.java) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 3 Hausaufgabe: Lösung class Dreieck { //in Datei Dreieck.java double Seite1, Seite2, Seite3; } class Ellipse{ //in Datei Ellipse.java double radius1, radius2; } class Trapez{ //in Datei Trapez.java double LangeSeiteUnten, KurzeSeiteOben, Winkel, rechteSeite; } //Erzeugen von Instanzen (in der main einer anderen Datei): Dreieck d = new Dreieck(); d.Seite1 = 5.4; d.Seite2 = 6.2; d.Seite3 = 9.3; Ellipse e = new Ellipse(); e.radius1 = 6.5; e.radius2 = 2.1; Trapez t = new Trapez(); t.LangeSeiteUnten = 12.9; t.KurzeSeiteOben = 4.9; t.Winkel = 70.0; t.rechteSeite = 8.2; G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 4 Wdh.: Klassen und Objekte • Klassen definieren allgemeine Eigenschaften (z.B. Definition geometrischer Figuren oder den Bauplan für ein Haus) • Von einer Klasse können Objekte (Instanzen) erzeugt werden (konkrete Ausprägung einer Klasse, z.B.: Rechteck mit Seitenlängen 10 und 7.5; oder das Beethoven-Haus) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 5 Wdh.: Klassen und Objekte • Klassen haben • Attribute, z.B. int seitenlaenge • Methoden, z.B. double flaecheninhalt(){...} • Objekte (Instanzen) • werden mit new erzeugt, z.B. Rechteck r = new Rechteck(); • haben Attributwerte, z.B. seitenlaenge = 7 • Methoden können für ein Objekt aufgerufen werden, z.B. double f = r.flaecheninhalt(); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 6 Unterscheidung Deklaration - Benutzung • Deklaration – class <Klassenname> {//Deklaration von Attributen u. Methoden} – in Datei <Klassenname>.java – nur einmal pro Klasse • Benutzung/Aufruf – kann "überall" und mehrmals erfolgen: • in Methode main • in Methode einer (anderen) Klasse – zuerst Erzeugung einer Instanz <Klassenname> r = new <Klassenname>(); – dann Zugriff auf Attribute • r.<Attribut> = .... – oder Aufruf von Methoden • r.<Methode>(); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 7 Methoden • Klassen bestehen aus Attributen und Methoden • Attribute speichern Werte einer Instanz – z.B. Seitenlänge = 3.5 bei einem Rechteck • Methoden werden für eine Instanz aufgerufen • Methoden führen Berechnungen auf der Instanz aus – – – – – greifen auf Attributwerte der Instanz zu geben diese z.B. aus berechnen z.B. den Flächeninhalt eines Rechtecks ändern z.B. Attributwerte ..... • Methoden realisieren das Prinzip der Kapselung G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 8 Methodendefinition • Syntax: class Klassenname { Typ1 Variablenname1; ... Rückgabetyp Methodenname (Parameterliste) { //Programmcode der Methode } } • Beispiel: class Rechteck { double breite, hoehe; double flaeche () { double flaecheninhalt = breite * hoehe; return flaecheninhalt; } } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 9 Beispiele für Methodendefinitionen class Rechteck { double breite, hoehe; // Attribute // Methode zur Berechnung des Umfangs double umfang () { // keine Parameter; Rückgabetyp double double umfang; // lokale Variable (ex. nur in der Methode) umfang = 2*breite + 2*hoehe; // Berechnung anhand der Attributwerte return umfang; // Rückgabe des berechneten Wertes } //Methode zum Ändern der breite: void aendereBreite(double neueBreite){ breite = neueBreite; } // Methode zur Ausgabe des Objekts (als Text) void ausgeben() { // keine Parameter; kein Rückgabewert System.out.println("Dieses Rechteck hat folgende Eigenschaften:"); System.out.print("Breite: " + breite + "Höhe: " + hoehe); System.out.print("Umfang: " + umfang()); //Methodenaufruf! } } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 10 Aufruf von Methoden Syntax: // Methode ohne Rückgabewert (void) objektvariable.methode1(Parameterliste); ... // Methode mit Rückgabewert variable = objektvariable.methode2(Parameterliste); Beispiel: myRechteck.ausgeben(); double flaecheninhalt; flaecheninhalt = myRechteck.flaeche(); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 11 Beispiele für Methodenaufrufe class Rechteck { double breite, hoehe; // Attribute // Methode zur Berechnung des Umfangs double umfang () { // keine Parameter; Rückgabetyp double double umfang; // lokale Variable (ex. nur in der Methode) umfang = 2*breite + 2*hoehe; // Berechnung anhand der Attributwerte return umfang; // Rückgabe des berechneten Wertes } //Methode zum Ändern der breite: void aendereBreite(double neueBreite){ breite = neueBreite; } // Methode zur Ausgabe des Objekts (als Text) void ausgeben() { // keine Parameter; kein Rückgabewert System.out.println("Dieses Rechteck hat folgende Eigenschaften:"); System.out.print("Breite: " + breite + "Höhe: " + hoehe); System.out.print("Umfang: " + umfang()); //Methodenaufruf! } } //Aufruf (dies steht in einer anderen Datei...) Rechteck r = new Rechteck(); r.aendereBreite(5.2); r.ausgeben(); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 12 Methoden mit und ohne Rückgabewert Ohne Rückgabewert • Deklaration: void methode(){ ..... Mit Rückgabewert • Deklaration: double methode(){ ... return double_Wert; } • • } Aufruf instanz.methode(); Methode muss kein „return“ haben • Aufruf: double d = instanz.methode() • Methode muss „return Wert“ haben; • Typ des Wertes = Rückgabetyp • Zweck: Liefert Ergebnis nach Außen G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 13 Methoden mit Rückgabewert • „return“ beendet Ausführung der Methode • Methode mir Rückgabewert darf nie ohne return beendet werden • Gegenbeispiel: boolean methode1(){ if(Bedingung1) return true; if(Bedingung2) return false; } Ende ohne „return“ wenn Bedingung1 falsch und Bedingung2 falsch • Richtig: boolean methode2(){ if(Bedingung3) return true; else return false; } Ende immer mit „return“ G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 14 Übungsaufgabe • Programmiert zwei Methoden der Klasse „Kreis“, die den Flächeninhalt und den Umfang eines Kreises berechnen und zurückgeben. Berechnet den Flächeninhalt und Umfang für eine Instanz und gebt sie aus. • Hinweis: Die Zahl pi erhält man durch Math.PI • Syntax: class Kreis{ double methode(){ ............. return double_Wert } } Aufruf: Kreis k = new Kreis(); double d = k.methode(); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 15 Methoden: Parameter • dienen dazu, Werte von Außen in die Methode zu geben • Parameter müssen Typ haben (wie Variablen) • Beispiel: Methode der Klasse Kreis: void setzeMittelpunkt(double x, double y){ mittelpunktX = x; mittelpunktY = y; } • Aufruf (k Referenzvariable für Klasse Kreis): k.setzeMittelpunkt(5.2,4.3); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 16 Methoden: Parameter • Parameter in der Methodendeklaration: – – – – Paare „Typ Variable“, durch Koma getrennt z.B. void setzeMittelpunkt(double x, double y) x,y: Formale Parameter Parameter werden in Methode verwendet • Parameter in Aufruf: – konkrete Werte (einer pro Parameter), durch Komma getrennt – z.B. k.setzeMittelpunkt(5.2,4.3); – aktuelle Parameter • Beim Aufruf werden formale durch aktuelle Parameter ersetzt • Beispiel: void setzeMittelpunkt(double 5.2 x , double 4.3 y ){ mittelpunktX = x5.2 ; mittelpunktY = y4.3 ; } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 17 Parameterübergabe: neueBreite = 5.2 Abarbeitungsreihenfolge Start //Aufruf: Rechteck r = new Rechteck(); void aendereBreite(double neueBreite){ breite = neueBreite;} r.aendereBreite(5.2); r.ausgeben(); fertig void ausgeben() { System.out.println("Dieses Rechteck hat folgende Eigenschaften:"); System.out.print("Breite: " + breite + "Höhe: " + hoehe); System.out.print("Umfang: " + umfang());} Rückgabewert: return 12.2 double umfang () { double umfang = 2*breite + 2*hoehe; return umfang;} G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 18 Konstruktoren (I): Motivation • Beispiel: Erzeugen eines Dreiecks mit drei Attributen seite1, seite2, seite3 Dreieck d; d = new Dreieck(); d.seite1 = 6.4; d.seite2 = 3.1; d.seite3 = 5.2; • Mit Konstruktor: Dreieck d; d = new Dreieck(6.4 , 3.1, 5.2); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 19 Konstruktoren (II) • Konstruktoren sind spezielle Methoden • Name des Konstruktors = Klassenname • Beispiel: Konstruktor für die Klasse Punkt (mit zwei Attributen xKoordinate und yKoordinate) Punkt(double x, double y) { xKoordinate = x; yKoordinate = y; } • werden implizit bei der Erzeugung mit new aufgerufen: Punkt p = new Punkt(4.9,8.5); • kein Rückgabewert (auch kein void) • darf fehlen (dann wird Standardkonstruktor verwendet) • Zweck: Initialisierung der Instanz, Zuweisung von Anfangswerten G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 20 Konstruktoren (III) Aufruf: kreis k = new kreis(); • Es kann mehrere Konstruktoren geben • diese müssen sich hinsichtlich Anzahl und Typ der Parameter unterscheiden Aufruf: • Beispiel: kreis k = new kreis(56); class kreis{ double mittelpunktX, mittelpunktY, radius; kreis() { mittelpunktY = 0; mittelpunktY = 0; radius = 1;} kreis(double r){ mittelpunktX = 0; mittelpunktY = 0; radius = r;} kreis(double r, double x, double y){ mittelpunktX = x; mittelpunktY = y; radius = r;} } } Aufruf: kreis k = new kreis(56,8,7); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 21 Übungsaufgabe • Programmiert drei Konstruktoren der Klasse Ellipse: • • • einen mit keinem Parameter (mit sinnvollen Default-Werten), einen mit einem Parameter (kleinerRadius) und einen mit vier Parametern (mittelpunktX, mittelpunktY, kleinerRadius, grosserRadius). • Syntax: class Kreis{ Kreis(int i, double d){ ............. } } • Aufruf: Kreis k = new Kreis(8,4.3); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 22 Kapselung • auf Attribute sollte von Außen nicht direkt zugegriffen werden • Zugriff von Außen nur über Methoden • Mechanismen, um dies sicherzustellen, kommen später – private und protected statt public für Attribute – entspricht "-" und "+" in UML-Klassendiagrammen G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 23 Wozu Kapselung? class kreis{ double radius, mittelpunktX, mittelpunktY; boolean setzteRadius(double neuerRadius){ if(neuerRadius > 0){ radius = neuerRadius; return true;} else return false; } } //ohne Kapselung: kreis k = new kreis(); k.radius = – 88; // radius negativ! //mit Kapselung kreis k = new kreis(); boolean b = k.setzeRadius(– 88); //radius nie negativ! G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 24 Auf welche Variablen darf in einer Methode zugegriffen werden? • auf die Attribute der Instanz, für die Methode aufgerufen wurde • auf die formalen Parameter (bei Aufruf durch aktuelle ersetzt) • auf lokale Variablen (in Methode deklariert und nur dort existent) • Beispiel: (für Klasse Rechteck mit laenge und breite) double volumen(double hoehe){ double v; v = laenge * breite * hoehe; return v; } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 25 Methoden - Lokale Variablen • Variablen, die innerhalb von Methoden deklariert werden, heißen lokale Variablen. • Lokale Variablen werden bei jedem Aufruf einer Methode neu angelegt und existieren nur für die Zeitdauer der Abarbeitung der Methode. • Im Gegensatz: Die evtl. innerhalb einer Methode erzeugten Objekte bestehen fort über die Methodenabarbeitung hinaus. – Aber: sollten alle Referenzen auf neue Objekte entfallen, weil am Ende einer Methode alle lokalen Referenzvariablen Aufhören zu existieren, so werden auch diese Objekte gelöscht (automatische Garbage Collection) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 26 Methoden - Lokale Variablen - Beispiel • Beispiel: void methode1(){ Punkt p = new Punkt(1.5, 6.7); ...... nichtLokal = p; } • p ist eine lokale Variable • nach Beendigung von methode1 – existiert p nicht mehr – existiert die Instanz Punkt(1.5, 6.7) zunächst noch – wird die Instanz Punkt(1.5, 6.7) gelöscht, wenn keine weitere Referenz darauf existiert – wird die Instanz Punkt(1.5, 6.7) nicht gelöscht, wenn es eine noch existierende Referenz darauf gibt G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 27 Beispiel: Klasse Punkt class Punkt{ double xKoordinate; //Attribut double yKoordinate; //Attribut Punkt(){ xKoordinate = 0.0; yKoordinate = 0.0;} //Konstruktor Punkt( double x, double y ){ xKoordinate = x; yKoordinate = y;} //Konstruktor double x_Koordinate() {return xKoordinate;} double y_Koordinate() {return yKoordinate;} void verschieben(double deltaX, double deltaY){ xKoordinate = xKoordinate + deltaX; yKoordinate = yKoordinate + deltaY; } double abstand(Punkt p){ double a = Math.sqrt(Math.pow(xKoordinate - p.xKoordinate,2.0) + Math.pow(yKoordinate - p.yKoordinate,2.0)); return a; //a ist lokale Variable, p ein Parameter } } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 28 Beispiel: Benutzung der Klasse Punkt Punkt p1 = new Punkt(6.0,8.0); Punkt p2 = new Punkt(8.0,23.0); p1.verschieben(2,12); double abstand = p1.abstand(p2); System.out.println("Der Abstand zwischen beiden Punkten beträgt " + abstand); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 29 Hausaufgabe • Definiert eine Klasse für Dreiecke, die in der Ebene eingebettet sind (d.h. alle drei Punkte haben x- und yKoordinaten). Definiert – einen komfortablen Konstruktor (der ein Dreieck in einem Schritt erzeugt) – eine Methode zur Berechnung des Umfangs, – eine Methode zum Verschieben des Dreiecks und – eine Methode zur textuellen Ausgabe. G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04 30