Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 9. Vorlesung WS 2001/2002 Übersicht • Klassen und Objekte: Vererbung – Konzeptueller Hintergrund: Spezialisierung – Modellierung mittels UML – Vererben von Variablen – Vererben von Methoden • Überlagerung von Methoden • Zugriff auf überlagerte Methoden T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 2 Klassenhierarchien • konzeptueller Hintergrund: Generalisierung Spezialisierung • Spezifikation in UML (Unified Modeling Language): Unterklasse 1 (speziell) Unterklasse 2 (speziell) Unterklasse 3 (speziell) Abstraktion Oberklasse (generell) T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 3 Beispiel zu Klassenhierarchien Person Ordentlicher Student Dozent Verwaltungsangestellter spezieller Student Gasthörer T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 4 Klassenhierarchien in Java (I) Syntax: class Unterklasse extends Oberklasse { ... } Beispiel: Datei Person.java: class Person { . . . } Datei Student.java: class Student extends Person { . . . } T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 5 Klassenhierarchien in Java (II) • Unterklassen haben genau eine Oberklasse • Eine Oberklasse 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 T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 6 Vererbung • 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 Eigenschaften aller darüberliegenden Oberklassen T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 7 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() T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 8 Vorteile der Vererbung • Implementation / Funktion einer Oberklasse kann zu einem späteren Zeitpunkt „quasi von außen“ verbessert bzw. korrigiert werden – es wird eine entsprechende Unterklasse definiert, die die zu ändernden Methoden und Variablen durch neue Versionen überlagert • Dadurch, dass Klassen durch Unterklassen in eigenen QuelltextDateien spezialisiert werden können, bleiben Programme langfristig erweiterbar. • Stufenweise Abstraktion der Klassenhierarchie ermöglicht die Wiederverwendbarkeit der generelleren Klassen für andere Projekte. – In einzelnen Projekten werden dann speziellere Unterklassen der eher generellen Klassen definiert. T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 9 Übung im GIS-Labor • Implementieren Sie die zwei Klassen Person und Student als Ober- bzw. Unterklasse: – Personen haben als Attribute (Instanzvariablen): • Vor- und Nachname • Straße und Hausnummer • PLZ und Ort – Studenten haben zusätzlich: • Matrikelnummer • Studiengang • Datum des Erstsemesters zur Erinnerung: class x extends y { ... } T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 10 Überlagerung (engl.: Overriding) • Methoden einer Unterklasse können Methoden gleicher Signatur (Name+Parameterliste) aus den Oberklassen überlagern – Zweck: Unterklassen modellieren speziellere Objekte; Methoden der Oberklasse müssen häufig ebenfalls spezialisiert werden • Zugriff: – im Normalfall wird die speziellste Methode verwendet – expliziter Aufruf einer überlagerten Methode Name der Oberklasse mittels: super.Name(. . .); T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 11 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); } } T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 12 Typkompatibilität • Einer Variablen der Klasse K dürfen Objekte der Klasse K sowie aller ihrer Unterklassen zugewiesen werden. Über die Referenzvariable p Beispiel: Student s = new Student(); Person p = s; kann nur auf die Methoden & Instanzvariablen des Studenten-Objekts zugegriffen werden, die von Person vererbt worden sind. • 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: Student s = new Person(); T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 13 Übungsaufgabe • 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 14