Fachbereich Informatik Lehrgebiet Programmiersysteme Prof. Dr. Friedrich Steimann FernUniversität in Hagen D-58084 Hagen (Name, Vorname) (Straße, Nr.) (PLZ) (Wohnort) (Land, falls außerhalb Deutschlands) Kurs 1618 SS 2005 Einführung in die objektorientierte Programmierung Klausur am 30.07.2005 Lesen Sie zuerst die Hinweise auf der Rückseite! Matrikelnummer: Geburtsdatum:.. Klausurort:... Aufgabe 1 2 3 4 5 Summe Teilaufgabe a b c d e a b c d e f a b a b c a b c d habe bearbeitet maximal 2 2 2 2 2 4 6 6 4 5 5 10 10 5 10 10 3 4 4 4 100 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 Nachklausur findet am 24.09.2005 statt; wenn Sie teilnehmen möchten, melden Sie sich bitte bis zum 15.08.2005 an. (Näheres siehe unser Informationsheft vom 09.05.2005). Hagen, den im Auftrag 2005 FernUniversität in Hagen
Hinweise zur Bearbeitung 1. Prüfen Sie die Vollständigkeit Ihrer Unterlagen. Die Klausur umfasst: 1 Deckblatt, 5 Aufgaben auf Seite 1 bis Seite 7. Geben Sie diese Unterlagen zusammen mit Ihren Lösungen später bitte vollständig ab, einschließlich Aufgabenstellung. 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) auf eigenes Papier. Kreuzen Sie die bearbeiteten Aufgaben auf dem Deckblatt an. Schreiben Sie unbedingt auf jedes Blatt Ihrer Lösungen die Aufgabennummer und Ihren Namen und Ihre Matrikelnummer. 4. Es sind keine Hilfsmittel zugelassen. 5. Lesen Sie vor der Bearbeitung einer Aufgabe den gesamten Aufgabentext sorgfältig durch. 6. Achten Sie darauf, dass Sie bei Programmieraufgaben Ihre Lösungen sinnvoll kommentieren; es könnten Ihnen sonst Punkte abgezogen werden. 7. Es sind maximal 100 Punkte erreichbar. Wenn Sie mindestens 40 Punkte erreichen, haben Sie die Klausur mit Sicherheit bestanden. 8. Sie erhalten die korrigierte Klausur zurück zusammen mit einer Bescheinigung für das Finanzamt und ggf. dem Übungsschein. 9. Legen Sie jetzt noch Ihren Studentenausweis und einen amtlichen Lichtbildausweis bereit, dann kann die Arbeit beginnen. Viel Erfolg!
Klausur zum Kurs 1618 im Sommersemester 2005 am 30.7.2005 1 Aufgabe 1: Kurz gefasst (10 Punkte) Kreuzen Sie in der Tabelle am Ende der Aufgabe für jeden Aufgabenteil an, ob die entsprechende Aussage richtig oder falsch ist und geben Sie im zugehörigen Feld eine kurze Begründung an. a) Der Modifikator final kann unabhängig von anderen Modifikatoren stets als Modifikator für Klassen verwendet werden. b) Von äußeren Klassen aus kann auf sämtliche Attribute und Methoden aller inneren Klassen zugegriffen werden, auch wenn sie als private deklariert sind. c) Zum Auflösen eines Methodenaufrufs wird nur der dynamische Typ der Empfängervariablen verwendet. d) Seien a und b zwei Ausdrücke in Java. Dann liefert die Auswertung der Ausdrücke (a & b) und (a && b) stets dasselbe Ergebnis. e) Soll in Java eine Methode einer Superklasse überschrieben werden, so muss für die überschreibende Methode in der Subklasse gelten: sämtliche Parametertypen einschließlich des Rückgabetyps müssen identisch sein mit den entsprechenden Typen der überschriebenen Methode. (Gehen Sie von der Darstellung im Kurs aus, die auf Java 2 basiert.) Aufgabe Richtig Falsch Weil... a) b) c) d) e) Hinweis: Für jedes Paar aus richtiger Antwort und richtiger Begründung gibt es 2 Punkte, ansonsten 0 Punkte.
Klausur zum Kurs 1618 im Sommersemester 2005 am 30.7.2005 2 Aufgabe 2: Verschiedenes (30 Punkte) a) Betrachten Sie das folgende Programm, das den booleschen Wert true in einen String umwandelt und auf der Systemausgabe anzeigt. public class TestAufruf { public static void main(string argv[]) { System.out.println(java.lang.String.valueOf(true)); Beschreiben Sie, aus welchen Teilen der Ausdruck java.lang.string.valueof(true) aufgebaut ist und was diese Teile bedeuten! b) Zeichnen Sie das Objektgeflecht, das entstanden ist, wenn die Ausführung der main- Methode die markierte Stelle erreicht hat! (6 Punkte) public class Objektgeflecht { Objektgeflecht a, b, c; public Objektgeflecht () { a = null; b = null; c = null; public Objektgeflecht (Objektgeflecht a, Objektgeflecht b, Objektgeflecht c) { this.a = a; this.b = b; this.c = c; public static void main (String argv[]) { Objektgeflecht u = new Objektgeflecht(); Objektgeflecht v = new Objektgeflecht(); Objektgeflecht w = new Objektgeflecht(u, v, null); (w.a).b = v; v.a = u.b; (u.b).c = w; w.c = v.c; u.c = (v.a).c; /* Markierung */
Klausur zum Kurs 1618 im Sommersemester 2005 am 30.7.2005 3 c) Betrachten Sie das folgende Java-Programm: class X { void compare (X x) { if (this.getclass().isinstance(x)) { System.out.println("x ist vom selben Typ wie this bzw. von einem Subtyp."); else System.out.println("x ist nicht zuweisungskompatibel mit this."); class Y extends X { void compare (X x) { super.compare(x); class Z extends Y { public static void main(string argv[]) { X x = new Y(); x.compare(new Z()); Was wird bei der Ausführung der main-methode ausgegeben? Begründen sie Ihre Antwort! (6 Punkte) Hinweise: Die Methode getclass() liefert den dynamischen Typ der Variablen zurück, auf der sie aufgerufen wird. Die Methode isinstance (Object o) der Klasse Class prüft, ob o vom Typ (oder einem Subtyp) der Klasse ist, die durch das Class-Objekt repräsentiert wird, auf dem die Methode aufgerufen wird. d) Wird das folgende Programm von einem Java-Übersetzer ohne Beanstandungen übersetzt? Falls nicht, warum? Begründen Sie Ihre Antwort! abstract class A { protected int i = 5; abstract void m1 (); void m2 (int i) { System.out.println(i); int m3 () { return i; class B extends A { int m3 () { return i + 5; public static void main (String arv[]) { A a = new B(); a.m3();
Klausur zum Kurs 1618 im Sommersemester 2005 am 30.7.2005 4 e) Schreiben Sie ein kleines Programmbeispiel, bei dessen Ausführung dynamisch gebunden wird! Erklären Sie genau, an welcher Stelle der Programmausführung dynamisch gebunden wird! Ihr Beispiel soll übersetzbar und ausführbar sein. (5 Punkte) f) Schreiben Sie ein kleines Programmbeispiel, an dessen Ausführung man erkennen kann, dass der Attributzugriff in Java nicht dynamisch gebunden wird! Ihr Beispiel soll übersetzbar und ausführbar sein. (5 Punkte) Aufgabe 3: Spezialisierung (20 Punkte) a) Betrachten Sie das folgende Programmfragment eines Typen für Buchstaben: public class Buchstabe { private int aktbuchstabe; public void setbuchstabe(char c) throws KeinBuchstabeException {... public char getbuchstabe() {... public void naechsterbuchstabe() {... Aufgabe: Die Klasse soll nur die Buchstaben A bis Z und a bis z verwalten. Der aktuelle Buchstabe soll als Integer-Zahl im Attribut aktbuchstabe gespeichert werden. Beachten Sie, dass man den ASCII-Code eines Zeichens als Dezimalzahl über einen Typecast auf int erhalten kann. Der ASCII-Code für die Buchstaben A bis Z liegt zwischen 65 und 90, der für a bis z zwischen 97 und 122. Vervollständigen Sie die Implementierung so, dass außerdem die unten aufgeführten Eigenschaften gelten. Vereinbaren Sie bei der Implementierung in der Klasse Buchstabe keine neuen Attribute! 1. Der Konstruktor soll ein Buchstabe-Objekt erzeugen und mit einem int-wert initialisieren, der A entspricht. (1 Punkte) 2. Die Methode naechsterbuchstabe() soll ein Buchstabe-Objekt auf den im Alphabet folgenden Buchstaben setzen. Die Folge sei dabei durch die Ordnung der ASCII-Codes vorgegeben, wobei auf den letzten Buchstaben ( z ) wieder der erste ( A ) folgt. (Die verwalteten Buchstaben werden also zyklisch behandelt!) 3. Die Methode setbuchstabe(char c) soll das Attribut aktbuchstabe auf den dem übergebenen Zeichen entsprechenden Integer-Wert setzen. Falls es sich bei dem übergebenen Wert nicht um einen der zu verwaltenden Buchstaben handelt, soll eine KeinBuchstabeException geworfen werden. Vereinbaren Sie dazu eine Klasse KeinBuchstabeException. KeinBuchstabeException soll Subtyp von Exception sein und die gesamte Funktionalität von Exception erben. 4. Die Methode getbuchstabe soll den aktuellen Buchstaben als Ergebnis liefern. Beachten Sie dabei, dass man ein Zeichen durch einen Typecast auf char aus seinem ASCII-Code zurückgewinnen kann. (1 Punkte)
Klausur zum Kurs 1618 im Sommersemester 2005 am 30.7.2005 5 b) Leiten Sie von der Klasse Buchstabe eine Klasse GrossBuchstabe mit den unten angegebenen Eigenschaften ab, deren Objekte nur die Großbuchstaben A bis Z verwalten! (10 Punkte) 1. Die Klasse GrossBuchstabe soll keine weiteren Attribute vereinbaren. 2. Sorgen Sie dafür, dass die Methoden naechsterbuchstabe und setbuchstabe entsprechend der Einschränkung auf Großbuchstaben arbeiten! 3. Implementieren Sie eine weitere Methode als Überladung von setbuchstabe, die den aktuell zu setzenden Buchstaben in Form eines int-wertes übergibt statt eines char-wertes. Der übergebene int-wert soll den ASCII-Code als Dezimalzahl repräsentieren. Aufgabe 4: Threads und Synchronisation (25 Punkte) a) Jedes Thread-Objekt hat eine public void run() und eine public void start()- Methode. Beschreiben Sie die unterschiedliche Bedeutung der beiden Methoden! (5 Punkte) b) Betrachten Sie die folgende Klasse, die die Implementierung einer Speicherzelle für int- Werte darstellt: class Speicherzelle { private int wert; public Speicherzelle (int w) { wert = w; public synchronized void setwert(int w ) { wert = w; public synchronized int getwert() { return wert; public synchronized void swapwert(speicherzelle s) { int h = s.getwert(); s.setwert(wert); setwert(h); Führen mehrere Threads den obigen Programmcode gleichzeitig aus, so kann es zu einer Verklemmung kommen. Beschreiben Sie eine solche Situation anhand eines konkreten Beispiels, in dem nur die swapwert-methode aufgerufen wird! (10 Punkte) c) Ändern Sie die Klasse Speicherzelle so ab, dass ihre Verwendung garantiert verklemmungsfrei ist und weiterhin wechselseitiger Ausschluss beim Zugriff auf gemeinsame Daten garantiert ist. Die Methode swapwert soll aus Sicht eines Threads eine unteilbare Operation sein. Begründen Sie, warum die geänderte Klasse die gestellten Anforderung erfüllt. (10 Punkte)
Klausur zum Kurs 1618 im Sommersemester 2005 am 30.7.2005 6 Aufgabe 5: Kapselung (15 Punkte) Diese Aufgabe behandelt den Zusammenhang zwischen Kapselungstechniken und Sicherheitsfragen. Gegeben ist folgendes Szenario: Eine Systemumgebung, repräsentiert durch ein Objekt vom Typ Umgebung, verwaltet, welche Personen Zugriff auf geschützte Systemteile haben. Deren Kennungen (Namen der Personen) werden als Strings in einem Objekt der Klasse Befugnis gespeichert. Umgebung und Befugnis sind wie folgt implementiert: package System; public interface Umgebung { public void setbefugnis(befugnis b); public Befugnis getbefugnis(); package System; public class Befugnis { protected String[] kennungen; public Befugnis() { kennungen = new String[5]; public String[] getkennungen() { return kennungen; Das Zusammenspiel zwischen Umgebung und Befugnis ist wie folgt: 1. Objekte vom Typ Befugnis können von beliebigen Klassen erzeugt und mit der Methode setbefugnis an die Systemumgebung übergeben werden. 2. setbefugnis speichert die übergebene Referenz und trägt die Kennungen der zugelassenen Personen in das String-Feld des Befugnis-Objekts ein, indem es direkt auf dessen Attribut kennungen zugreift. (Beachten Sie, dass Umgebung und Befugnis im gleichen Paket deklariert sind!) 3. Beliebige Nutzer des Systems können sich mittels der Methoden getbefugnis und get- Kennungen die Kennungen der zugelassenen Personen holen, um lesend auf diese zuzugreifen, also um diese z.b. mit anderen Kennungen zu vergleichen. Wir nennen das Zusammenspiel zwischen Umgebung und Befugnis ein sicheres System, wenn keine Klasse außerhalb des Pakets System die in einem Befugnis-Objekt gespeicherten Kennungen verändern kann. Aufgaben: a) Mit der obigen Implementierung ist das System nicht sicher. Beschreiben Sie, wie ein Angreifer unter Verwendung der Methode getkennungen die Liste der Kennungen manipulieren könnte! Unter einem Angreifer verstehen wir eine Klasse, die außerhalb des Pakets System deklariert ist. (3 Punkte) b) Geben Sie an, wie man die Implementierung der Klasse Befugnis ändern müsste, um den Angriff aus Teilaufgabe a) zu verhindern! Die modifizierte Befugnis-Klasse muss jedoch die Punkte 1 3 des oben beschriebenen Zusammenspiels weiterhin zulassen! Auch die Schnittstelle Umgebung sowie ihre Implementierung müssen von der Änderung unberührt bleiben.
Klausur zum Kurs 1618 im Sommersemester 2005 am 30.7.2005 7 c) Beschreiben Sie, wie ein Angreifer ohne Verwendung der Methode getkennungen die Liste der Kennungen manipulieren könnte! d) Geben Sie an, wie man die Implementierung der Klasse Befugnis ändern müsste, um den Angriff aus Teilaufgabe c) zu verhindern! Es gelten die gleichen Rahmenbedingungen wie bei Teilaufgabe b).