Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Gerhard Gröger Einführung in die Programmierung mit Java 9. Vorlesung WS 2002/2003 Übersicht • Besprechung der Hausaufgabe • Generalisierung/ Spezialisierung – Polymorphismus/Dynamisches Binden • Pakete • vordefinierte Listen G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 2 Hausaufgabe • Ergänzt die vorgestellten Klassen „Person“, „Student“ und "Mitarbeiter" um die Klasse „Dozent“ (Unterklassen von Person). Die Unterklasse „Dozent“ soll dabei noch weiter in „Professor“ und „Assistent“ unterschieden werden. • Erzeugt ein Objekt jeder Klasse und initialisiert dieses mit Beispieldaten. • Erzeugt ein Array, das Professoren und Assistenten speichert. Füllt dieses mit einigen Objekten. G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 3 Hausaufgabe: Lösung class Person{String nachname; Person(String nach){nachname = nach;}} class Dozent extends Person{String fach; Dozent(String nach, String f) {super(nach), fach = f;}} class Assistent extends Dozent{int vertragsdauer; Assistent(String nach, String f, int d) {super(nach, f), vertragsdauer = d;}} class Professor extends Dozent{String besoldungsGr; Professor(String nach, String f, String bg) {super(nach, f), besoldungsGr = bg;}} //von Außen (z.B. in main): Dozent [] dArray = new Dozent[3]; dArray[0] = new Assistent("Kolbe","GIS",3); dArray[1] = new Professor("Plümer","GIS","C4"); dArray[2] = new Professor("Förstner","Photo","C4"); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 4 Wdh: Vererbung von Methoden class Person{String nachname; void ausgabe(){System.out.println(nachname);} } class Dozent extends Person{String fach;} class Professor extends Dozent{String besoldungsGr;} ... Person p = new Person(); Dozent d = new Dozent(); Professor pr = new Professor(); p.ausgabe(); //Methode von Person d.ausgabe(); //geerbt von Person pr.ausgabe(); //geerbt von Person G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 5 Überlagerung von Methoden • Beispiel: class Person{String nachname; void ausgabe(){System.out.println(nachname);}} class Dozent extends Person{String fach; void ausgabe(){System.out.println(nachname + " " + fach);}} class Professor extends Dozent{String besoldungsGr; void ausgabe(){System.out.println(nachname + " " + fach + " " + besoldungsGr);}} • Eine Methode einer Unterklasse kann denselben Namen (z. B. ausgabe) und dieselbe Anzahl (z. B. 0) / denselben Typ der Parameter wie eine Methode einer Oberklassen haben • Die Methode der Unterklasse überlagert die gleichnamige Methode der Oberklasse • Es findet keine Vererbung statt G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 6 Überlagerung von Methoden • Bei Überlagerung von Methoden spricht man von Polymorphismus • Überlagerte Methoden sind beim Aufruf nicht unterscheidbar • Frage: Welche Methode wird verwendet? • Antwort: die der Klasse des Objekts, nicht die der Klasse der Referenzvariablen • Beispiel: (wie eben mit überlagerter Methode ausgabe()) Professor pr = new Professor(); Person p = pr; p.ausgabe();//ausgabe() von Professor, nicht von Person • Dies wird als Dynamisches Binden bezeichnet G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 7 Dynamisches Binden: Beispiel class Person{...void ausgabe(){...}} class Dozent extends Person{...void ausgabe(){...}} class Professor extends Dozent{...void ausgabe(){...}} //von Außen (z.B. in main): Person [] pArray = new Person[1000]; pArray[0] = new Assistent("Kolbe","GIS",3); pArray[1] = new Person("Schmitz"); .................... pArray[999] = new Professor("Förstner","Photo","C4"); for(int i = 0 ; i < 1000 ; i = i + 1) pArray[i].ausgabe(); //Welche der drei Methoden "ausgabe" aufgerufen wird, //wird zur Laufzeit ("dynamisch") abhängig von der //Klasse (Person, Dozent oder Prof) des Objekts an //pArray[i] entschieden G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 8 Dynamisches Binden: Vorteil • Die nachträgliche Ergänzung der Klassenhierarchie erfordert nicht, dass die Routine zur Ausgabe: for(int i = 0 ; i < 1000 ; i = i + 1) pArray[i].ausgabe(); geändert werden muss • Wird z.B. die Juniorprofessur eingeführt (neue Unterklasse von Dozent), so muss der Aufruf der Ausgabe nicht angepasst werden (wohl jedoch die Ausgabeprozedur für Juniorprofessoren selber) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 9 Pakete (engl. Packages) • Pakete dienen zur Strukturierung von Programmen oberhalb von Klassen. • Jedes Paket bildet einen eigenen Namensraum – Innerhalb eines Namensraumes dürfen keine gleichnamigen Klassen existieren – ergo: in unterschiedlichen Paketen dürfen identische Namen für Klassen vergeben werden. • Pakete bilden eigene Bereiche für den Zugriffsschutz (...später) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 10 Struktur von Paketen • Paket entspricht Verzeichnis (analog: Klasse Datei) • Gleicher Name für Paket und Verzeichnis – Verzeichnis: durch Backslash "\"verbunden – Paket: durch Punkt "." verbunden – Beispiel: Paket java.io entspricht Verzeichnis java\io • Ein Paket wird definiert, indem alle Dateien des Pakets am Dateianfang mit der Deklaration des Paketnamens versehen werden – Syntax: package <Paketname>; – Beispiel: package mein_eigenes_Paket; G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 11 Beispiel für vordefinierte Pakete: java.util • im Java Developer Kit (JDK) vordefiniertes Paket; beinhaltet u.a. Klassen für – Container-Klassen wie Vector, List, Mengen etc. – Arrays – Datums- und Zeitberechnungen • Paketname: java.util Der vorangestellte Verzeichnispfad wird über die Umgebungsvariable CLASSPATH festgelegt. • befindet sich im Verzeichnis ...\java\util • Erster Befehl in allen Quelltextdateien des Pakets: package java.util; G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 12 Pakete: Zugriff auf Klassen • • Zugriff auf Klassen im selben Paket: • mit Klassenname (wie bisher) • In Forte unmittelbar verbundene Dateien sind im selben Paket Zugriff auf Klasse X in einem anderem Paket P: 1. mit P.X (z.B. java.util.LinkedList) 2. mit X, (z.B. LinkedList), wenn Klasse P.X importiert wird: import P.X; z.B. import java.util.LinkedList; 3. mit X, (z.B. LinkedList), wenn ganzes Paket importiert wird: import P.*; z.B. import java.util.*; G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 13 import-Anweisung • muss erste Anweisung in einer Datei sein • Befehl: import Paketname.*; – importiert alle Klassen im Paket "Paketname" – auf diese kann in dieser Datei nur mit Klassennamen zugegriffen werden • Befehl: import Paketname.Klassenname; – importiert nur die Klasse "Klassenname" aus dem Paket "Paketname". – auf dies kann in dieser Datei nur mit Klassennamen zugegriffen werden G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 14 import: Beispiel import java.util.*; import java.io.File; .............. //Klassen LinkedList und Date sind aus Paket java.util LinkedList l = new LinkedList(); Date d = new Date(); //Klasse File ist aus Paket java.io File f = new File(); //Klasse Applet ist aus Paket java.applet java.applet.Applet a = new java.applet.Applet (); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 15 Das Default- und das Standard-Paket • Alle Klassen in Verzeichnissen, die im Forté Explorer unmittelbar verbunden sind, gehören zum sog. Default-Paket • hier sind weder package- noch import-Anweisungen nötig (wie bisher) – es kann auf alle anderen Klassen des Default-Pakets zugegriffen werden (z.B. bei der Erzeugen von Objekten mittels new) • Import des sogenannten Standard-Pakets java.lang (vordefiniert) nicht erforderlich • dieses Paket enthält z.B. die Klassen • String, Math, System, Object G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 16 Pakete: Beispiel Fehler, da Volumen in anderem Paket ist und nicht im Default-Paket G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 17 Pakete: Beispiel G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 18 Pakete: Beispiel G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 19 Pakete: Beispiel Fehler, da Dreieck.java nicht zum Paket mit Klasse Flaeche (Geometrie.Zweidimensional) gehört G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 20 Erzeugen von Paketen in Forte Erzeugt Pakete und die entsprechenden package-Befehle in Dateien automatisch G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 21 Übungsaufgabe • Erzeugt zwei Pakete "Feature" und "Geometrie". Das Paket "Feature" soll Unterpakete "Gebaeude" und "Strasse" haben, wobei "Gebaeude" die Klassen "Kirche" und "Einfamilienhaus" und "Strasse" die Klassen "Autobahn" und "Landesstrasse" enthalten soll. Das Paket Geometrie soll die Klassen "Punkt", "Linie" und "Flaeche" enthalten. • Erzeugt im Konstruktor der Klasse Autobahn ein Objekt der Klasse Linie. G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 22 Vordefinierte Pakete • Alle zum Java Developer Kit (JDK) gehörenden vordefinierten Klassen sind in Paketen untergebracht. • In Java sind sehr viele nützliche Pakete im Sinne von Standardbibliotheken vordefiniert z.B. für Listen, Suchstrukturen, Benutzeroberflächen, Graphik, Ein- und Ausgabe etc. • Übersicht: Öffnen der Startdatei der JavaDoc (JDKDokumentation) c:/Programme/jdk1.3.1/docs/api/index.html G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 23 Vordefinierte Listen: Klasse LinkedList • • Datentyp für Liste (vgl. Vorlesung "Diskrete Mathe") Anzahl der Elemente beliebig erweiterbar (im Ggs. zu Arrays) Elementtyp: Object Paket: java.util, muss importiert werden Methoden: • • • • • • • • boolean add(Object o) void add(int index, Object element) Object get(int index) //Index beginnt bei 0 void clear() int size() • weitere Methoden in JavaDoc G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 24 LinkedList: Beispiel import java.util.LinkedList; ..... LinkedList l = new LinkedList(); //Listenobj. erzeugen Person p = new Person(); Professor pr = new Professor(); Assistent a = new Assistent(); l.add(p); l.add(pr); l.add(a); Objekt o = l.get(1); //o referenziert den Prof. Professor pp = (Professor) o; //Typkonvertierung System.out.println(l.size()); //gibt 3 aus l.clear(); System.out.println(l.size()); //gibt 0 aus G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 25 Listen: Iteratoren • dienen zum sequentiellen Durchlaufen durch eine Liste • Iteratoren sind eigene Objekte, die mit der Liste eng verbunden sind • Iterator-Objekt wird durch Aufruf der Methode iterator() für Liste geliefert • Methoden der Klasse Iterator: • boolean hasNext(): wahr, wenn Durchlauf noch nicht fertig • Object next(): liefert nächstes Listenelement, setzt Zeiger ein Element weiter • Iteratoren führen intern einen Zeiger auf Listenelemente mit • Iterator ist verbraucht, wenn Ende der Liste erreicht • Eine Liste kann beliebig viele Iteratoren haben G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 26 Iteratoren: Beispiel import java.util.LinkedList; LinkedList ll = new LinkedList(); // Liste mit Werten füllen: ll.add(new Person()); ll.add(new Professor()); //Liste Durchlaufen: Iterator it = ll.iterator(); while(it.hasNext()) { Object o = it.next(); System.out.println(o); } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 27 Wh.: Typkonvertierung • Erforderlich, wenn Variable vom Typ einer Oberklasse ist, aber auf Eigenschaften der Unterklasse zugegriffen werden soll (und tatsächlich Unterklasse vorliegt) • Bei LinkedList erforderlich, da Elemente vom allgemeinsten Typ Object • Beispiel: Object o = iterator.next(); if( o instanceof Professor ) { Professor d = (Professor) o; String s = d.Besoldungsgruppe; } • instanceof dient zur Sicherstellung, dass Konvertierung gelingen wird G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 28 Übungsaufgabe • Schreibt ein Programm, dass in einer LinkedList it Personen nach einem Professor mit Namen "Plümer" sucht und diesen ausgibt. Testet das Programm mit geeigneten Elementen. • Beispiel für Syntax: LinkedList ll = new LinkedList(); Person p1 = new Person(); Professor p2 = new Professor(); ll.add(p1); ll.add(p2); Iterator it = ll.iterator(); while(it.hasNext()) { Object o = it.next(); if(o instanceof Person) Person p = (Person) o;} G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 29 Hausaufgabe • Schreibt ein Programm, das die Reihenfolge der Elemente in einer beliebigen LinkedList umdreht und das Ergebnis in einer neuen LinkedList speichert. Testet das Programm mit geeigneten Elementen. G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 30