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