Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Kurs 01618 SS 2013 _________________________________________________________ (Name, Vorname) „Einführung in die objektorientierte Programmierung“ _________________________________________________________ _________________________________________________________ (Straße, Nr.) ______________ (PLZ) Klausur am 07.09.2013 ________________________________________ (Wohnort) Dauer: 3 Std., 10 – 13 Uhr _________________________________________________________ (Land, falls außerhalb Deutschlands) Lesen Sie zuerst die Hinweise auf der folgenden Seite! Matrikelnummer: Geburtsdatum: . . Klausurort: _________________________ Aufgabe 1 2 3 4 5 6 7 8 9 10 Summe 15 5 10 10 10 10 10 10 10 10 100 habe bearbeitet maximal erreicht Korrektur ○ Herzlichen Glückwunsch, Sie haben die Klausur bestanden. Note: .......... ○ Sie haben die Klausur leider nicht bestanden. Für den nächsten Versuch wünschen wir Ihnen viel Erfolg. Die nächste Klausur findet im Wintersemester 2013/14 statt. Hagen, den 18.09.2013 Im Auftrag Musterlösung © 2013 FernUniversität in Hagen Klausur zum Kurs 01618 im Sommersemester 2013 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Hinweise zur Bearbeitung 1. Prüfen Sie die Vollständigkeit Ihrer Unterlagen. Die Klausur umfasst auf insgesamt 18 Seiten: 1 Deckblatt Diese Hinweise zur Bearbeitung 10 Aufgaben auf Seite 3-16 Zwei zusätzliche Seiten 17 und 18 für weitere Lösungen 2. Füllen Sie jetzt bitte zuerst das Deckblatt aus: Name, Vorname und Adresse Matrikelnummer, Geburtsdatum und Klausurort 3. Schreiben Sie Ihre Lösungen mit Kugelschreiber oder Füllfederhalter (kein Bleistift) direkt in den bei den jeweiligen Aufgaben gegebenen, umrahmten Leerraum. Benutzen Sie auf keinen Fall die Rückseiten der Aufgabenblätter. Versuchen Sie, mit dem vorhandenen Platz auszukommen; Sie dürfen auch stichwortartig antworten. Sollten Sie wider Erwarten nicht mit dem vorgegebenen Platz auskommen, benutzen Sie bitte die beiden an dieser Klausur anhängenden Leerseiten. Es werden nur Aufgaben gewertet, die sich auf dem offiziellen Klausurpapier befinden. Eigenes Papier ist nur für Ihre persönlichen Notizen erlaubt. 4. Kreuzen Sie die bearbeiteten Aufgaben auf dem Deckblatt an. Schreiben Sie unbedingt auf jedes Blatt Ihrer Klausur Ihren Namen und Ihre Matrikelnummer, auf die Zusatzblätter auch die Nummer der Aufgabe. 5. Geben Sie die gesamte Klausur ab. Lösen Sie die Blätter nicht voneinander. 6. Es sind keine Hilfsmittel zugelassen. 7. Lesen Sie vor der Bearbeitung einer Aufgabe den gesamten Aufgabentext sorgfältig durch. 8. Es sind maximal 100 Punkte erreichbar. Wenn Sie mindestens 50 Punkte erreichen, haben Sie die Klausur bestanden. 9. Sie erhalten die korrigierte Klausur zurück, zusammen mit einer Bescheinigung für das Finanzamt und ggf. dem Übungsschein. 10. Legen Sie jetzt noch Ihren Studierendenausweis und einen amtlichen Lichtbildausweis bereit, dann kann die Arbeit beginnen. Viel Erfolg! Musterlösung Seite 2 von 18 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Klausur zum Kurs 01618 im Sommersemester 2013 Aufgabe 1: Klassenimplementierung (15 Punkte) Gegeben sei folgendes Objektgeflecht: Tee name "Assam" herkunf t Land name Teekanne "Indien" Tee inhalt 1500 name sorte herkunf t "Darjeeling" Tee name herkunf t "Rooibos" Land name "Südaf rika" a) Implementieren Sie die Klassen Land, Tee und Teekanne sowie eine Klasse Demo, in deren main-Methode zunächst das dargestellte Objektgeflecht zusammengesetzt wird. Das Feld inhalt der Klasse Teekanne gibt hierbei die enthaltene Menge in ml an. Überschreiben Sie die Methode String toString(), sodass eine Zeichenkette Die Kanne enthält <Menge> ml Tee der Sorte <Teesorte> aus <Herkunftsland>. zurückgegeben wird. (Die in spitzen Klammern dargestellten Zeichenketten sind hierbei Platzhalter in der Aufgabenstellung und sollen durch die aktuellen Werte ersetzt werden.) b) Erweitern Sie Ihr Programm um eine Klasse Teetasse, die über ein Feld kapazitaet verfügt, dessen Wert bei der Erzeugung einer Instanz als Parameter des Konstruktors angegeben werden muss und das maximale Fassungsvermögen der Tasse (in ml) angibt. Außerdem verfügt sie über ein Feld inhalt, welches die eingefüllte Teemenge (in ml) angibt. Geben Sie weiterhin eine Implementierung für eine Methode der Klasse Teekanne mit der Signatur int fuelleEin(Teetasse tasse, int menge) throws TasseWirdUerblaufenException, TasseNichtLeerException an, die das folgende Verhalten vorweist: Ist die angegebene Tasse nicht leer, wird eine TasseNichtLeerException ausgelöst. Reicht der verbleibende Inhalt der Teekanne aus, um die im Parameter angegebene Menge einzufüllen, wird versucht, die angegebene Menge einzufüllen. Reicht die verbleibende Menge der Teekanne nicht aus, wird versucht, den in der Kanne verbleibenden Rest vollständig einzufüllen. Übersteigt die einzufüllende Teemenge die Kapazität der Tasse, wird eine TasseWirdUerblaufenException ausgelöst. Andernfalls werden die beiden inhalt Felder von Teetasse und Teekanne entsprechend der Situation nach dem erfolgreichen Eingießen aktualisiert. Schließlich wird durch die Methode auf der Konsole der Satz In die Tasse wurden <Menge> ml eingefüllt. In der Kanne verbleiben <Rest> ml. ausgegeben (die in spitzen Klammern dargestellten Zeichenketten sind wieder durch die aktuellen Werte zu ersetzen) und die Menge des eingefüllten Tees zurückgegeben. Sie können voraussetzen, dass die Klassen TasseWirdUerblaufenException und TasseNichtLeerException bereits deklariert sind und einen Standardkonstruktor haben. (Fortsetzung der Aufgabe auf folgender Seite) Musterlösung Seite 3 von 18 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Klausur zum Kurs 01618 im Sommersemester 2013 (Fortsetzung von Aufgabe 1) Antwort zu Aufgabe 1, Teilaufgabe a) class Land { String name; Land(String name) { this.name = name; } } class Tee { String name; Land herkunft; Tee(String name, Land herkunft) { this.name = name; this.herkunft = herkunft; } } class Teekanne { int inhalt; Tee sorte; Teekanne(int inhalt, Tee sorte) { this.inhalt = inhalt; this.sorte = sorte; } @Override public String toString() { return "Die Kanne enthält " + this.inhalt + "ml Tee der Sorte " + this.sorte.name + " aus " + this.sorte.herkunft.name + "."; } } public class Demo { public static void main(String[] args) { Land indien = new Land("Indien"); Land suedAfrika = new Land("Südafrika"); Tee assam = new Tee("Assam", indien); Tee darjeeling = new Tee("Darjeeling", indien); Tee rooibos = new Tee("Rooibos", suedAfrika); } Teekanne kanneTee = new Teekanne(1500, assam); System.out.println(kanneTee.toString()); } (Fortsetzung der Aufgabe auf folgender Seite) Musterlösung Seite 4 von 18 Klausur zum Kurs 01618 im Sommersemester 2013 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann (Fortsetzung von Aufgabe 1) Antwort zu Aufgabe 1, Teilaufgabe b) class Teetasse { int kapazitaet; int inhalt; Teetasse(int kapazitaet) { this.kapazitaet = kapazitaet; } } class Teekanne { /* * ... Code aus Aufgabe 1, Teilaufgabe a) */ int fuelleEin(Teetasse tasse, int menge) throws TassWirdUerblaufenException, TasseNichtLeerException { if (tasse.inhalt > 0) throw new TasseNichtLeerException(); int einfuellMenge = 0; if (this.inhalt < menge) einfuellMenge = this.inhalt; else einfuellMenge = menge; if (einfuellMenge > tasse.kapazitaet) throw new TassWirdUerblaufenException(); tasse.inhalt = einfuellMenge; this.inhalt = this.inhalt - einfuellMenge; System.out.println("In die Tasse wurden " + einfuellMenge + "ml (von " + menge + "ml) eingefüllt. In der Kanne verbleiben " + this.inhalt + "ml."); return einfuellMenge; } } Musterlösung Seite 5 von 18 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Klausur zum Kurs 01618 im Sommersemester 2013 Aufgabe 2: Objektgeflecht zur Laufzeit (5 Punkte) Zeichnen Sie das Objektgeflecht, welches bei Terminierung der Methode main-Methode der Klasse Demo existiert. class Quengelregal{ Regalboden[] regalboeden; Quengelregal(int h){ regalboeden = new Regalboden[h]; for (int i = 0 ; i < h ; i ++) regalboeden[i] = new Regalboden(); } } class Regalboden{ Produkt produkt; int menge; } class Produkt{ String name; } public class Demo { public static void main(String[] args) { Produkt schokolade = new Produkt(); schokolade.name = "Schokolade"; Produkt kaugummi = new Produkt(); kaugummi.name = "Kaugummi"; Quengelregal regal = new Quengelregal(4); regal.regalboeden[0].menge = 10; regal.regalboeden[0].produkt = schokolade; regal.regalboeden[0].menge = 5; regal.regalboeden[0].produkt = kaugummi; regal.regalboeden[1].menge = 10; regal.regalboeden[1].produkt = schokolade; regal.regalboeden[2].menge = 20; regal.regalboeden[2].produkt = schokolade; } } (Fortsetzung der Aufgabe auf folgender Seite) Musterlösung Seite 6 von 18 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Klausur zum Kurs 01618 im Sommersemester 2013 (Fortsetzung von Aufgabe 2) Quengelregal regalboeden Regalboden [ ] length 0 4 Regalboden menge 5 produkt 1 2 3 Regalboden menge 10 Produkt name "Kaugummi" Produkt name "Schokolade" produkt Regalboden menge 20 produkt Regalboden menge 0 produkt Musterlösung Seite 7 von 18 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Klausur zum Kurs 01618 im Sommersemester 2013 Aufgabe 3: Überschreiben und Überladen (10 Punkte) Gegeben sei folgendes Java-Programm: interface I{ void m(); } interface J extends I{ } abstract class A implements I{ abstract void n(I i); void n(J j){ System.out.println("n(J j) in A."); } public void m() { System.out.println("m() in A."); } } class B extends A{ void n(I i){ System.out.println("n(I } public void m() { System.out.println("m() } } class C extends A implements J{ void n(I i){ System.out.println("n(I } public void m() { System.out.println("m() } } i) in B."); in B."); i) in C."); in C."); public class Demo { public static void main(String[] args) { I i = new B(); J j = new C(); A a = new B(); B b = new B(); C c = new C(); a.m(); i.m(); j.m(); a.n(i); a.n(j); c.n(c); c.n(b); } } Welche Zeilen werden bei der Ausführung auf der Konsole ausgegeben? Begründen Sie ihre Antwort! (Fortsetzung der Aufgabe auf folgender Seite) Musterlösung Seite 8 von 18 Klausur zum Kurs 01618 im Sommersemester 2013 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann (Fortsetzung von Aufgabe 3) 1. 2. 3. 4. 5. 6. 7. m() m() m() n(I n(J n(J n(I in in in i) j) j) i) B. B. C. in in in in B. A. A. C. zu 1. a referenziert eine Instanz von B; die Implementierung von m in A wird hier überschrieben. zu 2. i referenziert eine Instanz von B; die Implementierung von m in A wird hier überschrieben. zu 3. j referenziert eine Instanz von C; die Implementierung von m in A wird hier überschrieben. zu 4. a referenziert eine Instanz von B; aufgrund des Typs des aktuellen Parameters i, I, wird an die Methode n(I i) in B gebunden. zu 5. a referenziert eine Instanz von B; aufgrund des Typs des aktuellen Parameters j, J wird an die von A geerbte Methode n(J j) gebunden. zu 6. c referenziert eine Instanz von C; aufgrund des Typs des aktuellen Parameters c, C (der sowohl über die Supertypen I und J verfügt), wird an die von A geerbte Methode n(j J) gebunden, da diese spezieller ist. zu 7. c referenziert eine Instanz von C; aufgrund des Typs des aktuellen Parameters b, B (der über den Supertypen I verfügt) wird an die Methode n(I i) in C gebunden. Musterlösung Seite 9 von 18 Klausur zum Kurs 01618 im Sommersemester 2013 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Aufgabe 4: Subtyping Was besagt die Grundregel des Subtyping? (Abs. 3.2.2.2) „Die Grundregel für Subtyping besagt, dass ein Objekt von einem Subtyp an allen Programmstellen vorkommen kann, an denen Supertyp-Objekte zulässig sind.“ Welche syntaktischen Voraussetzungen müssen erfüllt sein, wenn in einer Subklasse eine geerbte Methode überschrieben werden soll? (vgl. Abs. 3.2.2.2) Um eine Methode zu überschreiben, muss in der Subklasse eine Methode gleichen Namens deklariert werden. Weiterhin müssen die Typen von Parametern, Rückgabeparametern und Ausnahmen der überschreibenden Methode zu denen der überschriebenen passen; d.h.: Theoretisch: Kontravarianz bei Parametertypen; Kovarianz bei Rückgabe- und Ausnahmetypen. für Java >= 5: Gleichheit der Parametertypen, Kovarianz bei Rückgabe- und Ausnahmetypen. (Kontravarianz der Parametertypen wird in Java nicht unterstützt, da es andernfalls bei überladenen Methoden zu Konstellationen kommen kann, in denen der Compiler einen Methodenaufruf nicht eindeutig an eine Deklaration binden kann.) für Java < 5: Gleichheit von Parameter- und Rückgabetypen Ist es ausreichend, die syntaktischen Voraussetzungen zu überprüfen, um sicherzustellen, dass ein Typ ein Subtyp ist? Welche besondere Herausforderung liegt hierin für den Programmierer? (vgl. Abs. 3.2.2.2) Nein, das Konzept des Subtyping beschränkt sich nicht auf syntaktischer Konformität von Methodendeklarationen. Die Eigenschaft, dass ein Objekt eines Subtyps überall dort eingesetzt werden kann, wo ein Objekt eines Supertyps erwartet wird, stellt vielmehr auch die Forderung an das Verhalten des Objektes, dass es den Erwartungen genügen muss, die an den Supertypen gestellt werden. Nur, wenn diese Erwartungen durch den Subtyp nicht verletzt werden, verhält dieser sich konform und ist damit ein Subtyp. Dies sicher zu stellen ist Aufgabe des Programmierers, da in der Regel keine formale Verhaltensspezifikation vorliegt bzw. geprüft werden kann. Musterlösung Seite 10 von 18 Klausur zum Kurs 01618 im Sommersemester 2013 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Aufgabe 5: Exception Handling (10 Punkte) In welche Gruppen können die Ausnahmesituationen, die in einem Programm im Allgemeinen auftreten können, eingeordnet werden? 1. Ausnahmesituationen, die auf eine unvorsichtige Implementierungsarbeit hindeuten und die durch angemessene Überprüfungen vermieden werden können. 2. Ausnahmesituationen, die nicht vorhergesehen und nicht ausgeschlossen werden können, die aber zur Laufzeit mir hoher Wahrscheinlichkeit auftreten können und gegen die die Anwendung daher robust sein sollte; wie z.B. beim Netzwerk- / Datei-Zugriff oder Verwendung von Benutzereingaben. 3. Ausnahmesituationen, die durch nicht vorhergesehen werden können, auf die das Programm selber jedoch auch keine Einflussmöglichkeit hat. Wie spiegeln sich diese Gruppen in der Klassenbibliothek von Java wieder? zu 1. Klassen, die diese Gruppe von Ausnahmen beschreiben, sind Subklassen von RuntimeException zu 2. Klassen, die diese Gruppe von Ausnahmen beschreiben sind Subklassen von Exception oder Subtypen von Throwable, jedoch nicht von RuntimeException oder Error. zu 3. Klassen, die diese Gruppe von Ausnahmen beschreiben, sind Subtypen von Error. Nennen Sie 4 Ihnen bekannte Ausnahmetypen aus der Java-Standardbibliothek, die aus mindestens zwei verschiedenen der oben genannten Gruppen stammen. Erläutern Sie jeweils Ihre Zuordnung. NullPointerException (1) Durch defensives Programmieren kann diese Ausnahme vermieden werden. NumberFormatException (1) An den Stellen, an denen eine Zeichenkette in eine Zahl gewandelt werden soll, kann durch eine syntaktische Prüfung zuvor sichergestellt werden, dass die Konvertierung tatsächlich durchgeführt werden kann. FileNotFoundException (2) Da auch andere Programme Zugriff auf das Dateisystem haben, kann nicht ausgeschlossen werden, dass Dateien verändert oder gar gelöscht werden. Wann immer Dateien geladen werden soll (deren Pfad z.B. aus einer Konfigurationsdatei gelesen wird), muss damit gerechnet werden, dass die Datei nicht mehr gefunden werden kann. IOException (2) (z.B. bei Netzwerkkommunikation) Findet ein Nachrichtenaustausch zwischen verschiedenen Rechnern statt, muss damit gerechnet werden, dass die Verbindung aufgrund eines Netzwerkproblems gestört wird. OutOfMemoryError (3) Während der Programmausführung wird weiterer Speicher benötigt, der aber nicht zur Verfügung gestellt werden kann. Der zur Verfügung stehende Speicher wird durch den Benutzer beim Start der Anwendung beschränkt und kann durch das Programm selber nicht geändert werden. Musterlösung Seite 11 von 18 Klausur zum Kurs 01618 im Sommersemester 2013 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Aufgabe 6: GUI mit AWT (10 Punkte) Implementieren Sie ein Programm, welches in seiner main-Methode das folgende Fenster (Breihe: 400px; Höhe: 300px) auf dem Display des Benutzers darstellt. Bei einem Klick auf die hervorgehobene „Schließen“-Schaltfläche soll das Fenster geschlossen und das Programm beendet werden. Hinweis: Sollten Ihnen die exakten Namen der benötigten Klassen und Methoden nicht geläufig sein, dürfen Sie stattdessen auch deutschsprachige Platzhalter verwenden. Achten Sie in diesem Fall jedoch darauf, dass die gewählten Namen selbsterklärend sind. import import import import java.awt.Frame; java.awt.Label; java.awt.event.WindowAdapter; java.awt.event.WindowEvent; public class Demo { static Frame f = new Frame(); public static void main(String[] args) { f.setSize(400, 300); f.setVisible(true); f.add(new Label("Ein Text")); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { f.dispose(); } }); } } Musterlösung Seite 12 von 18 Klausur zum Kurs 01618 im Sommersemester 2013 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Aufgabe 7: Programmgerüste (10 Punkte) Wodurch zeichnen sich Programmgerüste aus? Erläutern Sie anhand eines Ihnen bekannten Beispiels. (Abs. 5.1) Ein Programmgerüst ist ein erweiterbares und anpassbares System von Klassen, das für einen allgemeinen, übergeordneten Aufgabenbereich eine Kernfunktionalität mit entsprechenden Bausteinen bereitstellt. Beispiel: Java AWT zur Gestaltung von Benutzeroberflächen (vgl. Abs. 5.2.2.5) „anpassbar“ Das AWT erlaubt die Anpassung der vordefinierten Komponenten, um z.B. die Darstellung auf dem Display des Benutzers oder das Verhalten der Komponenten anzupassen. „erweiterbar“ Das AWT erlaubt die Definition eigener Komponenten, die selbst bei der Implementierung verschiedener Benutzeroberflächen wiederverwendet werden können. „System von Klassen“ Die einzelnen Klassen des AWT sind eng miteinander gekoppelt. Um ihre eigene Aufgabe zu erledigen, müssen sie in der Regel viele Nachrichten mit Instanzen anderer Klassen austauschen, da sie von ihren Funktionalitäten abhängig sind. „allgemeiner, übergeordneter Aufgabenbereich“ Das AWT unterstützt die Implementierung von Benutzeroberflächen im Allgemeinen, ohne Details, z.B. zu ihrem Aufbau, festzulegen. „Kernfunktionalität“ Das AWT selbst bietet keine vordefinierte Benutzeroberfläche an, sondern lediglich die Bestandteile, um Elemente zu definieren, zu positionieren oder die Interaktion der Elemente festzulegen. Erst durch eine individuelle Konfiguration von Instanzen verschiedener Klassen entsteht eine darstellbare Benutzerschnittstelle. Musterlösung Seite 13 von 18 Klausur zum Kurs 01618 im Sommersemester 2013 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Aufgabe 8: Verteilte Systeme (10 Punkte) Geben Sie an, ob die folgenden Aussagen wahr oder falsch sind. Achtung! Falsche Antworten geben Minuspunkte, eine gesamt negative Punktzahl bei dieser Aufgabe wird Ihnen aber auf null Punkte aufgerundet. Bei einem verteilten System handelt es sich um eine Menge von Prozessen, die in einem gemeinsamen Adressraum Berechnungen durchführen. Wahr Falsch Unter synchroner Kommunikation versteht man den gleichzeitigen Versand von Nachrichten durch zwei unabhängige Prozesse. Wahr Falsch Unter asynchroner Kommunikation versteht man den Versand einer Nachricht und das unmittelbare Fortfahren der eigenen Berechnungen, ohne auf eine Reaktion des Empfängers zu warten. Wahr Falsch Da Objekte Daten und Operationen vereinen, sind sie für eine Verteilung über verschiedene Systeme gut geeignet. Wahr Falsch Bei einem Port handelt es sich um einen Rechner im Netzwerk. Wahr Falsch Ein Server sollte in nur einem einzigen Thread implementiert werden, um Verklemmungen zu vermeiden. Wahr Falsch Bei RMI handelt es sich um einen Mechanismus, der es erlaubt, Methoden von Objekten aufzurufen, die auf einem anderen Rechner zur Verfügung gestellt werden. Wahr Falsch In Java werden bei einem entfernten Methodenaufruf durch aktuelle Parameter referenzierte Objekte vom Rechner des aufrufenden Objektes zum Rechner des aufgerufenen Objektes verschoben. Wahr Falsch In Java repräsentiert ein Skeleton-Objekt ein aufrufendes Objekt auf der Seite des aufgerufenen Objektes. Wahr Falsch In Java reicht es aus, den RMI-URL zu kennen, um auf dem so identifizierten entfernten Objekt eine Methode aufzurufen. Wahr Falsch Musterlösung Seite 14 von 18 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Klausur zum Kurs 01618 im Sommersemester 2013 Aufgabe 9: Compilerfehler (10 Punkte) Zu folgendem Programm meldet der Java-Compiler fünf Fehler. public class C extends D{ public static void main(String[] args) { D d = new D(); Object o = d.toString(); int i = o; long j = i + 4; Long jLong = j; if ( args.length == 0){ throw new Exception("Keine Argumente angegeben."); } d.m(o); } } interface D{ void m(String s); } Finden und begründen Sie die fünf Fehler anhand der Hinweise: Compilerfehler zu Interfaces (1) Ein Interface zu einer Klasse wird hinter dem Schlüsselwort implements (nicht extends) angegeben. Compilerfehler zu Interfaces (2) Von einem Interface kann keine Instanz erzeugt werden. Compilerfehler zu Interfaces (3) Die Methode m(String s) ist in C nicht implementiert. Compilerfehler zu Zuweisungsoperationen Einer Variable des Typs int kann keine Instanz von Object zugewiesen werden. Compilerfehler zum Exception Handling Weder ist throw new … in einem try/catch-Block eingeschlossen, noch deklariert die mainMethode den Typ Exception als Typ einer möglicherweise auftretenden Ausnahme. Compilerfehler zum Subtyping Beim Aufruf von m wird versucht, den aktuellen Parameter, eine Instanz von Object, dem formalen Parameter mit dem Subtyp String zuzuweisen. Musterlösung Seite 15 von 18 Klausur zum Kurs 01618 im Sommersemester 2013 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Aufgabe 10: Java’s Friends (10 Punkte) Ein C++-Entwickler vermisst die Polymorphie, die in C++ mit Mehrfachvererbung einhergeht, in Java. Welche Alternative bzw. welchen Kompromiss können Sie ihm in Java anbieten? (Abs. 3.3.2) In Java gibt es keine Mehrfachvererbung – eine Klasse kann jeweils nur eine Klasse als ihre Superklasse deklarieren. Um dennoch zu einer Klasse mehrere Supertypen anzugeben, müssen diese als Interfaces definiert werden, von denen Klassen beliebig viele implementieren dürfen. So ist es möglich, dass Instanzen einer Klasse gleichzeitig mehrere, in keiner Subtypbeziehung stehenden Typen haben können. Ein C#-Entwickler vermisst Methodentypen, um einen Algorithmus als aktuellen Parameter einer anderen Methode anzugeben. Welche Alternative bzw. welchen Kompromiss können Sie ihm in Java anbieten? (Abs. 3.2.6.3) In Java ist es nicht möglich, eine Methode direkt zu referenzieren. Um einen Algorithmus dennoch in einer Variable referenzieren zu können, kann man eine Schnittstelle definieren, die genau eine Methode deklariert. Verschiedene Klassen (typischerweise anonyme Klassen) können diese Schnittstelle implementieren und jeweils eine individuelle Implementierung dieser Methode bereitstellen. An den Stellen, an denen in anderen Programmiersprachen einen Zeiger auf eine Methode verwendet wird, wird nun eine Referenz auf eine Instanz einer solchen Klasse übergeben. Ein Pascal-Entwickler vermisst Konstanten in Java. Welche Alternative bzw. welchen Kompromiss können Sie ihm in Java anbieten? (Abs. 2.1.4.1) Java kennt keine Konstanten, jedoch kann man Attribute als statisch (static) und unveränderlich (final) deklarieren. static macht das deklarierte Attribut zu einem Klassenattribut, sodass es unmittelbar nach dem Laden der Klasse durch den Class-Loader verfügbar und referenzierbar ist (insbesondere ohne zuvor eine Instanz der Klasse zu erzeugen). Weiterhin bewirkt final, dass dem Attribut ein initialer Wert zugewiesen werden muss (entweder an der Deklarationsstelle oder in einem Initialisierungsblock) und dieser nicht überschrieben werden kann. Es ist also (a) unabhängig von konkreten Objektinstanzen und (b) unveränderlich und eignet sich damit als Alternative zu Konstanten anderer Programmiersprachen. Musterlösung Seite 16 von 18 Klausur zum Kurs 01618 im Sommersemester 2013 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Zusätzlicher Platz für Ihre Lösungen Ergänzung zu Aufgabe Nr. Ergänzung zu Aufgabe Nr. Musterlösung Seite 17 von 18 Klausur zum Kurs 01618 im Sommersemester 2013 Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann Zusätzlicher Platz für Ihre Lösungen Ergänzung zu Aufgabe Nr. Ergänzung zu Aufgabe Nr. Musterlösung Seite 18 von 18