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
– Vererben von Methoden
– Vererbung und Arrays
– Typkonvertierung
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) {super(nach), fach = f;}}
class Assistent extends Dozent{int vertragsdauer;
Assistent(String nach, String f, int d)
{super(String nach, String f), vertragsdauer = d;}}
class Professor extends Dozent{String besoldungsGr;
Professor(String nach, String f, int d, String bg)
{super(String nach, String 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/denselben Typ der Parameter
(z. B. 0) wie eine Methode einer Oberklassen haben
• Die Methode der Unterklasse überlagert die 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
Beispiel zur Überlagerung von Methoden
class Person {
String vorname, nachname;
void ausgeben() {
System.out.println(vorname + nachname);
}
Ruft die überlagerte
}
die
Methode Überlagert
der Oberklasse
class Student extends Person {
gleichnamige
auf (welche
bereits für die
long matrikelnr;
Methode
Ausgabe der
darin der
void ausgeben() {
Oberklasse
definierten
Variablen sorgt)
super.ausgeben();
System.out.println(matrikelnr);
}
}
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
8
Besprechung: Summe der Dreiecksumfänge
class Dreieck{
....
static double summeDerUmfaenge = 0;
//Konstruktor
Dreieck(double p1x, double p1y, double p2x,...){
....
summeDerUmfaenge = summeDerUmfaenge + umfang();
}
double umfang(){...}
static double summeUmfaenge(){return summeDerUmfaenge;}
}
//Benutzung:
System.out.println(Dreieck.summeUmfaenge()); //liefert 0
Dreieck d1 = new Dreieck(1.7,4.3,6.2);
Dreieck d2 = new Dreieck(6.2,1.4,3.9);
System.out.println(Dreieck.summeUmfaenge()); //liefert Summe
//der Umfänge der Dreiecke d1 und d2
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
9
Besprechung der Hausaufgabe: Strings
• Ersetzt in einem String jedes Vorkommen von ä,ö,ü,ß
durch ae, oe, ue, ss
• 1. Schritt: Ersetzten eines Vorkommens von ä,ö,ü,ß:
String s = ...;
int i = s.indexOf("ö");
if(i != -1) {
s = s.substring(0,i) + "oe" + s.substring(i+1,s.length());
}
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
10
Besprechung der Hausaufgabe: Strings
• Ersetzt in einem String jedes Vorkommen von ä,ö,ü,ß
durch ae, oe, ue, ss
• 2. Schritt: Ersetzten aller Vorkommen von ä,ö,ü,ß:
String s = ...;
int i = s.indexOf("ö");
if(i != -1) {
s = s.substring(0,i) + "oe" + s.substring(i+1,s.length());
}
i = s.indexOf("ä");
if(i != -1) {
s = s.substring(0,i) + "ae" + s.substring(i+1,s.length());
}
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
11
Besprechung der Hausaufgabe: Strings
• Ersetzt in einem String jedes Vorkommen von ä,ö,ü,ß
durch ae, oe, ue, ss
• 2. Schritt: Ersetzten aller Vorkommen von ä,ö,ü,ß:
String s = ...;
boolean ende = false;
while ( ! ende )
{
ende = true;
int i = s.indexOf("ö");
if(i != -1) {
s = s.substring(0,i) + "oe" + s.substring(i+1,s.length());
ende = false;
}
i = s.indexOf("ä");
if(i != -1) {
s = s.substring(0,i) + "ae" + s.substring(i+1,s.length());
ende = false;
}
}
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
12
Klassenhierarchien
• konzeptueller Hintergrund:
Generalisierung  Spezialisierung
• Spezifikation in UML (Unified Modeling Language):
Unterklasse 1
(speziell)
Unterklasse 2
(speziell)
Unterklasse 3
(speziell)
Abstraktion
Oberklasse
(generell)
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
13
Beispiel zu Klassenhierarchien
Ein Student ist eine
Person
Ordentlicher
Student
Person
Dozent
Verwaltungsangestellter
spezieller
Student
Ein Dozent ist eine
Person
Gasthörer
Ein Gasthörer
ist ein Student
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
14
Klassenhierarchien in Java: Syntax
Syntax:
class Unterklasse extends Oberklasse {
...
}
Beispiel:
Datei Person.java:
class Person {
. . .
}
Datei Student.java:
class Student extends Person {
. . .
}
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
15
Klassenhierarchien in Java: Allgemeines
• Eine Klasse hat höchstens eine Oberklasse
(Einfachvererbung)
• Eine Klasse kann beliebig viele Unterklassen
besitzen
• Unterklassen können selber wieder Unterklassen
besitzen
• Die oberste Klasse in Java ist die Klasse Object
– alle Klassen sind direkt oder indirekt (wg. Transitivität)
Unterklassen von Object
– wird bei der Klassendefinition kein extends-Schlüsselwort
angegeben, so ist die neue Klasse automatisch direkte
Unterklasse von Object
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
16
Vererbung
• Konsequenz aus Spezialisierung
• Eine Unterklasse erbt alle Eigenschaften ihrer
Oberklasse:
– Eine Unterklasse erbt alle Variablen ihrer Oberklasse
– Eine Unterklasse erbt alle Methoden ihrer Oberklasse
• Vererbungsbeziehung ist transitiv
– eine Unterklasse erbt die Variablen und Methoden aller
darüber liegenden Oberklassen
• wenn A Unterklasse von B ist und B Unterklasse von C,
dann erbt A auch von C
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
17
Bsp. für Vererbung von Variablen & Methoden
class A {
int aVar;
void aMethode(){...}
}
Variablen & Methoden der Klasse
aVar
aMethode()
class B extends A {
int bVar;
void bMethode(){...}
}
aVar, bVar
aMethode(), bMethode()
class C extends B {
int cVar;
void cMethode(){...}
}
aVar, bVar, cVar
aMethode(), bMethode(), cMethode()
class D extends C {
int dVar;
void dMethode(){...}
}
aVar, bVar, cVar, dVar
aMethode(), bMethode(),
cMethode(), dMethode()
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
18
Übung im GIS-Labor
• Implementiert die Klassen Person, Student und
Mitarbeiter, wobei Person Oberklasse der beiden
anderen Klassen ist:
– Personen haben als Attribute:
• Vor- und Nachname
– Studenten haben zusätzlich:
• Matrikelnummer
• Studiengang
– Mitarbeiter haben zusätzlich
• Namen des Instituts
zur Erinnerung: class Unter extends Ober { ... }
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
19
Konstruktoren: Beispiel
• class Person{
String nachname;
Person(){nachname = "unbekannt";}
Person(String nach){nachname = nach;}
}
class Student extends Person{
long matnr;
Student() {nachname = "unbekannt"; matnr = -999;}
Student(String nach, long matr){
nachname = nach; matrikelnr = matr;}
}
• Problem: Konstruktoren der Unterklasse wiederholen Befehle der
Konstruktoren der Oberklasse
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
20
Konstruktoren: Beispiel
• class Person{
String nachname;
Person(){nachname = "unbekannt";}
Person(String nach){nachname = nach;}
}
class Student extends Person{
long matnr;
Student() {nachname = "unbekannt"; matnr = -999;}
Student(String nach, long matr){
nachname = nach; matrikelnr = matr;}
}
• Bessere Lösung: Konstruktoren der Unterklasse rufen Konstruktoren der
Oberklasse auf
• Verwendung der Methode super()
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
21
Konstruktoren: Beispiel mit Methode super
• class Person{
String nachname;
Person(){nachname = "unbekannt";}
Person(String nach){nachname = nach;}
}
class Student extends Person{
ruft Person() auf
long matnr;
Student() {super(); matnr = -999;}
Student(String nach, long matr){
super(nachname); matrikelnr = matr;}
}
ruft Person(nachname) auf
• super() ruft den Konstruktor der Oberklasse auf, der
dieselbe Anzahl/Typ von Parametern hat.
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
22
Typkompatibilität I
• Referenzvariablen gehören zu Klassen und Objekte
gehören zu Klassen
• Frage: Welche Objekte dürfen welchen
Referenzvariablen zugewiesen werden?
• Antwort: Einer Referenzvariablen der Klasse K dürfen
Objekte der Klasse K sowie aller Unterklassen von K
zugewiesen werden.
• Beispiel:
Student s = new Student();
Person p = s;
//OK, da Person Oberklasse von
//Student ist
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
23
Typkompatibilität II
• Der umgekehrte Weg geht nicht:
– Einer Variablen der Unterklasse K kann kein Objekt ihrer
Oberklasse zugewiesen werden (dem Objekt fehlen die für die
Unterklasse spezifischen Eigenschaften)
• Beispiel 1:
Person p = new Person();
Student s = p; //geht nicht, da nicht jede Person
//ein Student ist
• Beispiel 2:
Student s1 = new Student();
Person p = s1; //s1 wird als Person angesehen
Student s2 = p; //geht nicht, da nicht jede Person
//ein Student ist
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
24
Typkompatibilität: Zulässige Attribute/Methoden
• Welche Attribute/Methoden können verwendet werden?
• Es können nur die Attribute/Methoden der Klasse der
Referenzvariablen verwendet werden, nicht die der Klasse
des Objekts
• Beispiel:
Student s = new Student();
Person p = s; //Student p wird als Person angesehen
p.nachname = "Schmitz"; //OK, da nachname Attribut
//von Person ist
p.matrikelnr = 123456; //geht nicht, da matrikelnr
//kein Attribut von Person
//ist
– p zeigt zwar auf ein Objekt der Klasse Student (mit matrikelnr),
dieses Objekt wird jedoch wie eine Person behandelt. Personen
haben i. Allg. keine matrikelnr.
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
25
Vererbung und Arrayelemente: Beispiel
• Für die Verwaltung des Hochschulsports sollen Studenten, Mitarbeiter
und Externe in einem Array gespeichert werden.
• Welchen Elementtyp hat das Array?
• 1. Ansatz: Elementtyp Object:
Object [] hsspArray = new Object[200];
hsspArray[0] = new Student("Schmitz");
hsspArray[1] = new Mitarbeiter("Meyer");
hsspArray[2] = new Person("Schulz");
//Durchsuchen nach Person namens "Schulz":
for(int i = 0 ; i < 3 ; i = i + 1)
if( hsspArray[i].name == "Schulz") ... //geht nicht
• Problem I: Object hat kein Attribut "name"
• Problem II: in Array kann alles (jede Unterklasse von Object)
hereingesteckt werden
• Klasse zu allgemein
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
26
Vererbung und Arrayelemente: Beispiel
• Für die Verwaltung des Hochschulsports sollen Studenten, Mitarbeiter
und Externe in einem Array gespeichert werden.
• Welchen Elementtyp hat das Array?
• 2. Ansatz: Elementtyp Student
Student [] hsspArray = new Student[200];
hsspArray[0] = new Student("Schmitz");
hsspArray[1] = new Mitarbeiter("Meyer"); //geht nicht
• Problem: ein Mitarbeiter ist kein Student
• Klasse zu speziell
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
27
Vererbung und Arrayelemente: Beispiel
• Für die Verwaltung des Hochschulsports sollen Studenten, Mitarbeiter
und Externe in einem Array gespeichert werden.
• Welchen Elementtyp hat das Array?
• 3. Ansatz: Elementtyp Person:
Person [] hsspArray = new Person[200];
hsspArray[0] = new Student("Schmitz");
hsspArray[1] = new Mitarbeiter("Meyer");
hsspArray[2] = new Person("Schulz");
//Durchsuchen nach Person namens "Schulz":
for(int i = 0 ; i < 3 ; i = i + 1)
if( hsspArray[i].name == "Schulz") ... //OK
• Person hat Attribut "name"
• Funktioniert dank Vererbung (Mitarbeiter und Student sind Unterklasse
von Person)
• Auch Mitarbeiter und Student werden als Person angesehen
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
28
Typkonvertierung zwischen Klassen
• Beispiel: In dem Hochschulsportarray (Elementtyp: Person) soll der
Student mit der Matrikelnummer 1234 gesucht werden
• Problem: Personen haben keine Matrikelnummer
• Lösung: Typkonvertierung von Person zu Student:
Person [] hsspArray = new Person[200];
.......
Student s = (Student) hsspArray[i];
if( s.matrikelnr == 1234 ) ...}
• Vgl. Typkonvertierung von double zu int in Vorlesung 2
• Vorsicht: Typkonvertierung ist nur erlaubt, wenn Referenzvariable
(hsspArray[i])tatsächlich auf ein Objekt vom Typ Student (oder
einer Unterklasse von Student) verweist
• Wie ermittelt man, ob ein Objekt zu einer bestimmten Klasse
gehört?
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
29
Ermittlung der Klassenzugehörigkeit
• Wie ermittelt man, ob ein Objekt zu einer bestimmten Klasse
gehört?
• Operator instanceof
• Syntax: referenzvariable instanceof Klassenname
• liefert true, wenn referenzvariable auf ein Objekt der Object
Klasse Klassenname oder einer Unterklasse von
Klassenname verweist
• Beispiel (Student Unterklasse von Person):
Person
Person p = new Person();
Student s = new Student();
Student
Object o = p;
if( o instanceof Person ) ... //liefert true
if( o instanceof Student ) ... //liefert false
o = s;
if( o instanceof Person ) ... //liefert true
if( o instanceof Student ) ... //liefert true
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
30
Bsp: Suchen nach Matrikelnummer
• Beispiel: In dem Hochulsportarray (Elementtyp: Person) soll der
Student mit der Matrikelnummer 1234 gesucht werden
Person [] hsspArray = new Person[200];
hsspArray[0] = new Student("Schmitz");
hsspArray[1] = new Mitarbeiter("Meyer");
hsspArray[2] = new Person("Schulz");
....................
//Durchsuchen nach Student mit Matrikelnr 1234
for(int i = 0 ; i < hsspArray.length ; i = i + 1)
{
if( hsspArray[i] instanceof Student)
{
Student s = (Student) hsspArray[i]; //Typkonvert.
if( s.matrikelnr == 1234 ) ....
}
}
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
31
Übungsaufgabe
• Schreibt ein Programm, das in dem
Hochschulsportarray (Elementtyp: Person) die Anzahl
der Studenten ermittelt.
• Hinweise:
– Person [] hsspArray = new Person[200];
– hsspArray[0] = new Student("Schmitz");
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
32
Herunterladen