Klausur zum Kurs 1618

Werbung
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
Herunterladen