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
8. Vorlesung WS 2002/2003
Übersicht
• Besprechung der Hausaufgabe(n)
• Generalisierung/ Spezialisierung
– Modellierung mittels UML (vgl. GIS I)
– Vererben von Variablen
– Vererben von Methoden
– Vererbung und Arrays
– Typkonvertierung
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
2
Hausaufgabe: Summe der Dreiecksumfänge
• Ergänzt die Klasse "Dreieck" so, dass mit einer
Methode die Summe der Umfänge aller bisher
erzeugten Dreiecke ermittelt und zurückgegeben
werden kann. Erzeugt drei Dreiecke und gebt die
Summe der Umfänge vorher und nachher aus.
• Hinweis:
– es bietet sich an, die Summe der Umfänge in einem
statischen Attribut zu speichern
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03
3
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
4
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
5
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
6
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
7
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
8
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
9
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
10
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
11
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
12
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
13
Ü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
14
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
15
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
16
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
17
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
18
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
19
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
20
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
21
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
22
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
23
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
24
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
25
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
26
Ü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
27
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
28
Herunterladen