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

Werbung
Institut für Kartographie und Geoinformation
Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe
Einführung in die
Programmierung mit Java
10. Vorlesung WS 2001/2002
Übersicht
• Besprechung der Übungsaufgabe
• Polymorphie
– Dynamisches Binden
• Vererbung Fortsetzung
– Abstrakte Klassen
T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02
2
Übungsaufgabe vom 9. 1.
• Ergänzen Sie die vorgestellten Klassen „Person“ und
„Student“ um die Unterklassen „Dozent“ und
„Verwaltungsangestellter“. Die Unterklasse „Dozent“
soll dabei noch weiter in „Professor“ und „Assistent“
unterschieden werden.
• Alle Klassen sollen eine Methode void ausgeben()
besitzen, die den Inhalt aller Instanzvariablen ausgibt.
(Die Methoden ausgeben() der Unterklasse überlagern
dann die gleichnamige Methode der Oberklasse(n))
• Erzeugen Sie ein Objekt jeder Klasse, initialisieren Sie sie mit
Beispieldaten und geben Sie die Objekte anschliessend
mittels der Methode ausgeben() aus.
T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02
3
Lösung Schritt 1: Klassendiagramm in UML
Person
Dozent
Professor
Verwaltungsangestellter
spezieller
Student
Assistent
T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02
4
Lösung Schritt 2: Implementierung
• Entwurfsentscheidungen
– Die Methode ausgeben() von Unterklassen soll zur Ausgabe
aller geerbten Instanzvariablen auf die (überlagerte)
Methode ausgeben() der Oberklasse zurückgreifen.
– Zur Sicherstellung der vollständigen Initialisierung neuer
Objekte sollte jede Klasse mindestens einen Kontruktor
erhalten, dessen Parameterliste alle Instanzvariable der
Klasse (inklusive der geerbten) enthält.
• Siehe Dateien
– Person.java
– Student.java und Dozent.java
– Assistent.java
T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02
5
Polymorphie (Vielgestaltigkeit)
Es gibt zwei Arten von Polymorphie:
1. Polymorphie von Operationen
– ein und derselbe Methodenaufruf kann in verschiedenen
Klassen klassenspezifisch, d.h. durch jeweils eigene
Methodenrümpfe behandelt werden
2. Polymorphie von Objekten
– gibt es nur bei Vererbungshierarchien
– an die Stelle eines Objektes in einem Programm kann stets
auch ein Objekt eines seiner Unterklassen treten
– andersherum formuliert: ein Objekt einer bestimmten Klasse
kann in der Gestalt aller in der Vererbungshierarchie
darüberliegenden Klassen auftreten
T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02
6
Dynamisches Binden
• Aufgrund des Polymorphismus kann bei überlagerten Methoden
erst zur Laufzeit entschieden werden, in welcher Unterklasse die
entsprechende Methode aufgerufen wird.
• Die Bindung des Methodennamens an ein konkretes
Programmteilstück im Hauptspeicher erfolgt somit dynamisch.
• Beispiel:
Person[] personen = new Person[4];
personen[0] = new Dozent(...);
personen[1] = new Student(...);
personen[2] = new Assistent(...);
personen[3] = new Person(...);
for (int i=0; i<4; i++)
personen[i].ausgeben();
T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02
7
Abfrage der Klassenzugehörigkeit
• Die Frage, von welcher Klasse ein bestimmtes Objekt
eine Instanz ist, kann mit dem instanceof-Operator
abgefragt werden:
Beispiel:
if (Referenzvariable instanceof Klasse) {. . .}
• Sinn: Vermeidung von Runtime-Exceptions / Abstürzen
Beispiel:
Anzahl der Studenten in einem Personenarray zählen
T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02
8
Abstrakte Klassen
Motivation am Beispiel geometrischer Figuren
Figur
verschiedene
gemeinsame Oberklasse
geometrische Figuren,
als Abstraktion
fläche()
ausgeben()
aber gleiche
Aufgabenstellung:
Schnittstellen
1. In einem Array sollen beliebige geometrische Figuren
Lösung:
man definiert
Aufgabenstellung:
abgelegt
werdendie
können. Wie geht man vor?
Methode
als
2.
Wo istfläche()
das Problem,
wenn man den
Flächeninhalt
Methode
fläche() kann
abstrakte Methode und
aller im Array enthaltenen Figuren auf
berechnen
will?nicht
dieser Ebene
markiert dadurch, dass Sie
erst in einer Unterklasse
Dreieck
Ellipse
implementiert
wird.
seite1 : float
radius1 : float
seite2 : float
seite3 : float
fläche()
ausgeben()
Kreis
radius : float
radius2 : float
fläche()
ausgeben()
fläche()
ausgeben()
implementiert werden,
Trapez
da
Flächenberechnung
Rechteck
grundlinie1 : float
breite
: float
vom
konkreten
Typ
grundlinie2 : float
höhe : float
höhe : float
abhängt.
fläche()
ausgeben()
fläche()
ausgeben()
T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02
9
Definition abstrakter Klassen
abstract class Figur {
...
abstract double fläche(); // abstrakte Methode
...
}
• Bei der Definition abstrakter Methoden werden nur
die Methodenköpfe (Methodenname sowie
Parameterliste) festgelegt.
T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02
10
Anmerkungen (I) zu abstrakten Klassen
• Eine Klasse ist abstrakt, wenn sie mindestens eine
abstrakte Methode enthält.
– Abstrakte Klassen können auch konkrete Methoden und
Variablen enthalten.
• Eine abstrakte Methode verspricht, dass alle
nichtabstrakten Unterklassen dieser Klasse diese
abstrakte Methode implementieren
• Von abstrakten Klassen lassen sich keine Instanzen
erzeugen.
T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02
11
Anmerkungen (II) zu abstrakten Klassen
• Man kann trotzdem Referenzvariablen vom Typ einer
abstrakten Klasse verwenden – diese dürfen aber nur
Objekte von nicht abstrakten Unterklasse enthalten.
Beispiel:
Figur f1= new
Figur();
Figur f=new Kreis(4.0);
double area=f.fläche();
Nicht möglich, da Figur
abstrakte Klasse
T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02
12
Übungsaufgabe
• Implementieren Sie die Klassen Figur, Dreieck,
Ellipse und Trapez aus dem Beispiel auf Folie 9. Figur
soll eine abstrakte Klasse sein.
• Erweitern Sie jede der vier Klassen um die Methode
umfang(). Diese ist bei Figur abstrakt.
• Erzeugen Sie ein Array, das Dreiecke, Ellipsen und
Trapeze enthält.
• Berechnen Sie die Summe der Umfänge aller
geometrischen Figuren im Array.
T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02
13
Herunterladen