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