Kein Folientitel - Institut für Geodäsie und Geoinformation der

Werbung
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
• Zugriffsspezifikationen (public, private,...)
• 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, int d, 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 "Features" und "Geometrie".
Das Paket "Features" soll Unterpakete "Gebäude"
und "Strassen" haben, wobei "Gebäude" die Klassen
"Kirche" und "Einfamilienhaus" und "Strassen" die
Klassen "Autobahn" und "Landesstrasse" enthalten
soll. Das Paket Geometrie soll die Klassen "Punkt",
"Linie" und "Fläche" enthalten.
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
Zugriffsspezifikationen I
• Zugriffsspezifikation regeln welche Klassen, Attribute und
Methoden wo verwendet werden können.
• Schlüsselwörter public, protected, private
• wird keine Zugriffsspezifikation angegeben, gilt der
default-Modus friendly
• Differenziert für Klassen, Methoden, und Attribute
• Wichtiges Konzept der Objektorientierung:
Geheimnisprinzip: Verbergen von Details der
Implementierung, Zugriff nur über klar definierte
Schnittstellen
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
24
Zugriffsspezifikationen II
• public: Zugriff von allen Klassen
• friendly oder keine Spezifikation: Zugriff
von Klassen im selben Paket, Zugriff nicht
von Unterklassen in anderen Paketen
geheimer
• protected: Zugriff von Klassen im selben
Paket, auch Zugriff von Unterklassen in
anderen Paketen
• private: Zugriff nur innerhalb derselben
Klasse
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
25
Das Schlüsselwort final
• Variablen mit vorangestelltem final sind Konstanten,
d.h. sie dürfen nicht verändert werden
Beispiel: final double PI = 3.141529;
• Methoden mit vorangestelltem final dürfen nicht
überlagert werden (kein Polymorphismus, effizienter)
• Klassen mit vorangestelltem final dürfen keine
Unterklassen haben (kein Polymorphismus, effizienter)
Beispiel: public final class String .....
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
26
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
27
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
28
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
29
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
30
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
31
Ü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
32
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
33
Herunterladen