Block 4, Aufgabe 1: Vererbung Leiten Sie die Klasse Student von der Klasse Person ab. Die Klasse Student soll zusätzlich zu den Eigenschaften der Klasse Person noch das Attribut matrikelnummer haben. Die Methode print() der Klasse student soll zusätzlich zur Methode print() der Klasse person auch die matrikelnummer ausgeben. Fehlende Stellen im Programm sind durch ... gekennzeichnet. Ergänzen Sie die fehlenden Stellen. import java.io.*; class Person { private String name; private String vorname; public Person() { System.out.print("\n\nGeben Sie den Nachnamen ein (Ende mit Strg+z) : "); name = input(); System.out.print("\n\nGeben Sie den Vornamen ein (Ende mit Strg+z) : "); vorname = input(); } public String input() { String line=""; int c=0; try { while( (c = System.in.read())!=-1) { line = line + (char)c; } } catch (IOException e) { System.out.println("Lesefehler"); } return line; } public void print() { System.out.print("\nNachname: "+name); System.out.print("\nVorname: "+vorname); } } public class Student . . . . . { private String matrikelnummer; public Student() { . . . . ./* Aufruf des Konstruktors der Vaterklasse */ Lösungen Java-Kurs Block 4, SS 2002 1 System.out.print("\n\nGeben Sie die Matrikelnummer ein (Ende mit Strg+z) : "); matrikelnummer = input(); } public void print() { . . . . ./* Aufruf der Methode print der Vaterklasse */ System.out.print("\nMatrikelnummer : "+matrikelnummer); } public static void main(String args[]) { System.out.print("\nStart des Programms"); System.out.print("\n\nPerson"); Person pers1 = new Person(); System.out.print("\n\nStudent"); Student stud1 = new Student(); System.out.print("\n\nAusgabe Person"); pers1.print(); System.out.print("\nAusgabe Student"); stud1.print(); } } Die Lösung ist: public class Student extends Person2 { private String matrikelnummer; public Student() { super(); System.out.print("\n\nGeben Sie die Matrikelnummer ein (Ende mit Strg+z) : "); matrikelnummer = input(); } public void print() { super.print(); System.out.print("\nMatrikelnummer : "+matrikelnummer); } } Block 4, Aufgabe 2: Polymorphismus. Dynamische Bindung Überall, wo ein Objekt einer Klasse stehen kann, kann in Java auch ein Objekt einer abgeleiteten Klasse eingesetzt werden. Zeigt eine Referenz Vater auf ein Objekt einer abgeleiteten Klasse Sohn, so wird beim Aufruf einer Methode Vater.methode() tatsächlich die Methode der abgeleiteten Klasse aufgerufen. Demonstrieren Sie dies, indem Sie in der Methode main() des folgenden Programms eine Referenz auf ein Objekt der Klasse Person erzeugen und ihm ein auf dem Heap erzeugtes Objekt der Klasse Studiosus zuweisen und anschließend für die Referenz die Methode print() aufrufen. Lösungen Java-Kurs Block 4, SS 2002 2 Die Lösung ist: import java.io.*; class Person { private String name; private String vorname; public Person() { try { byte[] eingabe = new byte [80]; System.out.print("\nGeben Sie den Nachnamen ein: "); System.in.read(eingabe); name = new String(eingabe); eingabe = new byte[80]; System.out.print("\nGeben Sie den Vornamen ein: "); System.in.read(eingabe); vorname = new String(eingabe); } catch (IOException e) { System.out.println (e.toString()); System.exit(1); } } public void print() { System.out.print("\nNachname: "+name); System.out.print("\nVorname: "+vorname); } } public class Studiosus extends Person { private String matrikelnummer; public Studiosus() { super(); try { byte[] eingabe = new byte[80]; System.out.print("\nGeben Sie die Matrikelnummer ein: "); System.in.read(eingabe); matrikelnummer = new String(eingabe); } catch (IOException e) { System.out.println (e.toString()); System.exit(1); } } public void print() { super.print(); Lösungen Java-Kurs Block 4, SS 2002 3 System.out.print("\nMatrikelnummer: "+matrikelnummer); } public static void main(String args[]) { System.out.print("\nStart des Programms"); System.out.print("\n\nPerson"); Person pers1 = new Studiosus(); // eine Referenz kann auf // ein Objekt einer abgelei// teten Klasse zeigen System.out.print("\n\nAusgabe\n"); pers1.print(); // // // // Es wird die Methode nicht der Referenz, sondern des abgeleiteten Objekts aufgerufen } } Block 4, Aufgabe 3: Reihenfolge von Konstruktoraufrufen Die Klasse TestKonstruktoren soll zum Test der Reihenfolge von Konstruktoraufrufen bei abgeleiteten Klassen dienen. //Datei TestKonstruktoren class TestKonstruktoren { public static void main (String[] args) { System.out.println ("Exemplar von A wird angelegt"); A aRef = new A(); System.out.println(); System.out.println ("Exemplar von B wird angelegt"); B bRef = new B(); System.out.println(); System.out.println ("Exemplar von C wird angelegt"); C cRef = new C(); System.out.println(); } } Schreiben Sie 3 Klassen A, B und C, welche jeweils nur einen Konstruktor ohne Parameter enthalten. Im Konstruktor der Klasse A soll ausgegeben werden: System.out.println("Klasse A - Konstruktor ohne Parameter"); Entsprechendes gilt für die Klassen B und C. Beachten Sie, dass B von A und C von B abgeleitet sein soll. Die Lösung ist: //Datei A.java class A { A() { System.out.println("Klasse A - Konstruktor ohne Parameter"); } } Lösungen Java-Kurs Block 4, SS 2002 4 //Datei B.java class B extends A { B() { System.out.println ("Klasse B - Konstruktor ohne Parameter"); } } //Datei C.java class C extends B { C() { System.out.println("Klasse C - Konstruktor ohne Parameter"); } } Die Ausgabe ist: Exemplar von A wird angelegt Klasse A - Konstruktor ohne Parameter Exemplar von B wird angelegt Klasse A - Konstruktor ohne Parameter Klasse B - Konstruktor ohne Parameter Exemplar Klasse A Klasse B Klasse C von C wird angelegt - Konstruktor ohne Parameter - Konstruktor ohne Parameter - Konstruktor ohne Parameter Block 4, Aufgabe 4: Vernichtung von Objekten Schreiben Sie eine Klasse Alpha. Die Zahl der erzeugten Objekte von Alpha soll im Konstruktor hochgezählt werden. Im Konstruktor soll der folgende Text ausgegeben werden: ObjektX erzeugt X soll dabei die Nummer des jeweiligen Objektes sein. In der finalize()-Methode der Klasse Alpha soll ausgegeben werden: ObjektX wurde geloescht Zum Testen soll die Klasse TestGarbage dienen. Beginnen Sie beim Erzeugen mit wenig Objekten und steigern Sie die Objektanzahl, bis der Garbage Collector tätig wird. Lösungen Java-Kurs Block 4, SS 2002 5 //Datei TestGarbage.java import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; // Bitte ignorieren class TestGarbage { static public void main (String[] args) { int n = 0; /* Anzahl zu erzeugender Objekte int zahl = 0; /* Zahl */ */ InputStreamReader inp = new InputStreamReader (System.in); BufferedReader buffer = new BufferedReader (inp); try { String eingabeN; System.out.println ("Gib die Anzahl zu erzeugender Objekte ein: "); eingabeN = buffer.readLine(); try { n = Integer.parseInt(eingabeN); } catch (NumberFormatException nFExcept) { System.out.println (nFExcept.toString()); System.exit(1); } } catch (IOException ioexcept) { System.out.println (ioexcept.toString()); System.exit(1); } for (int lv = 0; lv < n; lv++) { Alpha alphaRef = new Alpha(); } } } Die Lösung ist: //Datei: Alpha.java class Alpha { static int objektanzahl = 0; int nummer; Alpha() { objektanzahl++; nummer = objektanzahl; System.out.println ("\nObjekt" + nummer + " erzeugt"); } protected void finalize() throws Throwable { System.out.print ("\nObjekt" + nummer + " wurde geloescht"); } } Lösungen Java-Kurs Block 4, SS 2002 6