Aufgabe 1: Quickies (25 Punkte)

Werbung
Aufgabe 1:
1
Matrikelnummer:
Name:
Quickies
a) Statisches und dynamisches Binden
(25
Punkte)
(4 Punkte)
Erklären Sie die Begriffe statisches Binden und dynamisches Binden.
b) Multiple Choice
(10 Punkte)
Kreuzen Sie an, ob die folgenden Aussagen richtig oder falsch sind. Für eine richtige Antwort
gibt es i Punkt, für eine falsche Antwort wird f Punkt abgezogen, ansonsten werden 0 Punkte
vergeben. Sie können in dieser Teilaufgabe minimal 0 und maximal 10 Punkte erreichen.
richtig falsch
Wenn ein Thread seine runO-Methode abgearbeitet hat, kann man auf
dem zugehörigen Thread-Objekt keine Methode mehr aufrufen.
Die Variable super bezeichnet immer ein Objekt der Superklasse.
Da ein Objekt im Konstruktor erst erstellt wird, kann man die Variable
this im Konstruktor noch nicht benutzen.
Abstrakte Methoden sind automatisch immer final.
Konstrukteraufrufe werden dynamisch gebunden.
Methoden einer Klasse K mit Modifier protected sind nur in Subklassen im Paket von K und innerhalb der Klasse K sichtbar.
Methoden in Interfaces sind immer public.
Attributzugriffe werden in Java immer statisch gebunden.
Sei C eine Klasse und static void m(> eine Methode von C. Dann liefert
die Anweisung ( (C>null> .mO ; keine Nullpointer-Exception.
Dynamische Bindung wird in Java durch Ad-hoc-Polymorphie realisiert.
Lightweight-AWT-Komponenten besitzen kein zugehöriges Peer-Objekt.
In Java kann es passieren, dass zwei verschiedene Threads gleichzeitig
den Code einer synchronisierten Methode ausführen.
Das Schlüsselwort implements ermöglicht in Java Subtyping ohne Vererbung.
Die Container-Klasse im AWT ist von der Klasse Component abgeleitet.
Da Java eine interpretierte Sprache ist, können sich Kapselung und Methodenbindung nicht gegenseitig beeinflussen.
Eine überschriebene Methode muss mehr oder gleich viele Ausnahmetypen in der throws-Deklaration zulassen wie die überschreibende.
Äuf einem Objekt 0 kann eine Methode ausgeführt werden, obwohl der
Konstruktor von 0 noch nicht zu Ende ausgeführt ist.
Java garantiert faires Scheduling von Threads.
Jede AWT-Komponente referenziert genau einen ActionListener.
Java Threads können über gemeinsamen Speicher oder den InterruptMechanismus kommunizieren.
,
Name:
Matrikelnummer:
c) Objektgeflechte
2
(5 Punkte)
Zeichnen Sie das Objektgeflecht, das nach der Ausführung der main-Methode entstanden ist.
class Anfang (
Object o = null;
Anfang a,b,c;
Anfang (Anf ang pa, Anfang pb, Anfang pc> C
.a = pa; b = pb; c = pc;
1
.
public static v o i d main(StringC1 argv) (
Anfang a = new Anfang(null,null,null);
Anfang b = new Anfang(a,a,null);
Object o = new Object0 ;
new Anfang(a,null,b).o = 0;
Anfang c = new Anfang(a,b,a);
c.c = c.b.b;
3
3
d) Objektreferenzen
(6 Punkte)
Der Programmierer P. Ascal hat in einem Java-Kurs gelernt, dass Objekte in Java immer als
Referenzen übergeben werden. Er implementiert eine Wrapper-Klasse für int-Werte mit einer
swap-Methode zum Vertauschen der int-Werte zweier Integer-Wrapper-Objekte folgendermaßen:
class Integer (
private int value;
p u b l i c Integercint i> 4 value = i; 3
public int getValue0 ( return value; 1
public static void swap(Integer x, Integer y> C
Integer h;
h=x;x=y;y=h;
3
3
1. Was ist an der Implementierung der swap-Methode falsch?
(3 Punkte)
2. Implementieren Sie eine korrekt funktionierende swap-Methode!
(3 Punkte)
Name:
Aufgabe 2:
Matrikelnummer:
Gerüste und Bausteine
a) Gerüste
3
(25 Punkte)
(5 Punkte)
Beschreiben Sie, warum Javas Stromklassen kein Programmgerüst und die Klassen des AWT
ein Programmgerüst darstellen!
b) Bausteine
(20 Punkte)
In dieser Aufgabe sollen Sie Bausteine aus dem Baukasten der Stromklassen in Java benutzen, um eine neue Klasse ObjectZipOutput zu implernentieren. Diese Klasse soll einen
FileOutputStream, einen ObjectOutputStream und einen GZIPOutputStream’so miteinander kombinieren, dass Objektgeflechte durch einen Object-Strom, einen GZIP-Strom und
einen File-Strom komprimiert in eine Datei geschrieben werden können. Gegeben sei das
folgende Klassenfragment:
import java.util.zip.*; import j a v a . i o . * ;
class ObjectZipOutput <
...
public ObjectZipOutputCString s> throws IOException < . . . 3
public void writeObject(Serializable 01 throws IOException < . . . )
public void close0 thxows IOException < . . . 3
3
Implementieren Sie den Konstruktor und die fehlenden Methoden des angegebenen Klassenfragments mit den folgenden Eigenschaften:
1. Der Konstruktor erzeugt die notwendigen Stromobjekte und kombiniert sie in geeigneter
Weise miteinander. (Der übergebene String bezeichnet die Datei, in die geschrieben
werden soll.)
(9 Punkte)
2. Die wxite0b j ect-Methode benutzt die write0b j ect-Methode des ObjectOutput-Stroms,
um ein serialisierbares Objektgeflecht in die kombinierten Ströme zu schreiben. Falls die
close-Methode mindestens einmal aufgerufen wurde, soll writeobj ect eine IOException
mit entsprechendem Text zurückliefern.
(7 Punkte)
3. Die close-Methode ruft die entsprechenden close-Methoden der beteiligten Stromobiekte auf.
f4 Punkte)
‘Ein solches Strom-Objekt komprimiert die Daten, die hineingeschrieben werden, mit dem Algorithmus des
gzip-Werkzeuges.
Matrikelnummer:
Name:
Aufgabe 3
Vererbung und Subtyping
4
(18 Punkte).
Im Folgenden betrachten wir einen Speicher für beliebige Objekte. Gegeben seien die Schnittstelle ObjectStore und deren fragmentarische Implementierung als Klasse ObjectStoreImpl:
interface ObjectStore C
// liefert das gespeicherte Objekt
Object getObject0;
void setObject(Object 01; // speichert ein Objekt
1
class ObjectStoreImpl implements ObjectStore C
private Object element;
ObjectStoreImplCObject o> ( setObject( 3
...
1
Ausgehend von dieser Implementierung soll ein Speicher realisiert werden, der nur StringObjekte speichert:
interface StringStore (
String getString0;
// liefert das gespeicherte String-Objekt
void setString(String s); // speichert ein String-Objekt
a) Implernentieren Sie eine Klasse StringStoreImpl, die von der Klasse ObjectStoreImpl
erbt und Subtyp von StringStore ist! String-Speicher sollen nur String-Objekte speichern;
nicht benötigte Methoden sollen wirkungslos sein. Achten Sie darauf, dass Ihre Implementie(8 Punkte)
rung vollständig ist!
b) Zeichnen Sie die Subtyprelation der Typen Ob jectstore, StringStore, Ob jectStoreImp1
und StringStoreImpl auf! Welche Subtypbeziehung(en) entspricht/entsprechen keiner istein-Beziehung?
(5 Punkte)
c) Welche Eigenschaft müsste für Vererbung und Subtyping in Java gelten, damit das in b)
identifizierte Problem nicht auftritt?
(3 Punkte)
d) Mit welchem im Kurs beschriebenen Sprachmittel, das es in Java derzeit noch nicht gibt,
könnte man die Wiederverwendung von Programmcode im betrachteten Beispiel deutlich
verbessern?
(2 Punkte)
N a m e :
Aufgabe 4
Matrikelnummer:
Threads, Synchronisation
a) Synchronisation
5
(32 Punkte)
(9 Punkte)
Gegeben sei das folgende Java-Programm,
class Aha extends Thread C
static int n=l;
t public static void main(StringC1 argv) <
new AhaO. starte;
new Aha().start();
public void run0 (
for (int i=l;iC=5;i++) I
System.out.printlnW;
n++;
1
1
3
das bei einer Ausführung die folgende Ausgabe liefert:
1
2
3
4
4
5
6
7
9
10
1. Erklären Sie, wie es dazu kommen kann, dass die 4 in der Ausgabe doppelt vorkommt
und die 8 fehlt!
(3 Punkte)
2. Warum reicht es nicht aus, die Methode run als synchronized zu kennzeichnen, damit
immer alle Zahlen von eins bis zehn ausgegeben werden?
(3 Punkte)
3. Ergänzen Sie das Programm um Synchronisationskonstrukte so, dass bei jeder möglichen
Ausführung alle Zahlen von eins bis zehn ausgegeben werden! Führen Sie dazu keine
neuen Methoden ein!
(3 Punkte)
c
Name:
Matrikelnummer:
b) Monitore
(23 Punkte)
Der Fachbereich Informatik möchte einen Duschraum fiir Mitarbeiterinnen und Mitarbeiter
einrichten. Dieser soll aus Kostengründen sowohl von Männern als auch von Frauen genutzt
werden, allerdings nicht gleichzeitig. Um Kapazität und Auslastung der Dusche zu bestimmen,
will der Dekan das Duschen der 50 Mitarbeiter und 50 Mitarbeiterinnen vorher mit einem
Java-Programm simulieren:
class Dusche X
static int frauen=O, maenner=O;
static void rein(Person p) (
if (p instanceof Mann) maenner = maenner+l; else frauen=frauen+l;
3
static void raus(Person p) (
if (p instanceof Mann) maenner=maenner-1; else frauen=frauen-1;
3
static void duschen(Person pl < 3
public static void main(String[l argv> (
for( int i = 0; i<50; i++ > C
new MannO;new FrauO;
3
3
abstract class Person extends Thread <
Person0 X start0; 3
public void run(> (
Dusche.rein(this);
Dusche.duschen(this);
Dusche.raus(this);
class Mann extends Person 0
class Frau extends Person {)
Erweitern Sie das Simulationsprogramm für die Dusche so, dass die folgenden Eigenschaften
erfüllt sind: (Die Teilaufgaben können getrennt voneinander oder zusammen gelöst werden.
Kennzeichnen Sie deutlich, was zu jedem Aufgabenteil gehört, sonst droht Punktabzug!)
1. Es sollen sich nie mehr als zehn Personen gleichzeitig in der Dusche befinden. (7 Punkte)
2. Es sollen sich zu jedem Zeitpunkt nur Frauen oder nur Männer in der Dusche befinden.
(7 Punkte)
3. Das Duschen soll fair sein, d.h. es gibt keine Situation, so dass jemand unendlich lange
wartet.
(9 Punkte)
Herunterladen