Klausur zum Kurs 1618 im Sommersemester 2002 am 10.8.2002 1 Aufgabe 1: Objekte, Klassen, Vererbung (15 Punkte) Was ist der Unterschied zwischen a) einem Objekt und einer Klasse? b) der Instanz einer Klasse und einem Objekt vom Typ der Klasse? c) einer lokalen Variablen und einem Attribut? Warum kann d) eine Klasse nicht mit dem Modifizierer private versehen werden (sofern es sich nicht um eine innere Klasse handelt)? e) man innerhalb einer Subklasse nur Methoden und Attribute hinzufügen, aber nicht entfernen? Aufgabe 2: Überladen / Überschreiben (20 Punkte) In dieser Aufgabe geht es um das Überladen und Überschreiben von Methoden. Aufgaben: a) Erläutern Sie, was man unter dem Überladen von Methoden (overloading) versteht. Erläutern Sie auch, wie die aktuell auszuführende Methode ausgewählt wird. (5 Punkte) b) Grenzen Sie den Begriff Überschreiben von Methoden (overwriting) gegen den des Überladens von Methoden ab. Erläutern Sie auch hier, anhand welcher Kriterien die aktuell auszuführende Methode ausgewählt wird. (5 Punkte) c) Geben Sie jeweils ein Beispiel für das Überladen und Überschreiben von Methoden an. Die Beispiele sollen den Unterschied zwischen beiden Begriffen deutlich machen. Klassen aus den Java-Bibliotheken wie z.b. String oder Beispiele aus dem Kurstext dürfen NICHT verwendet werden (auch nicht gebunden umbenannt). (10 Punkte)
Klausur zum Kurs 1618 im Sommersemester 2002 am 10.8.2002 2 Aufgabe 3: Ereignissteuerung (25 Punkte) Im Folgenden wollen wir drei Objekte betrachten, zwei Buttonobjekte und ein Textfeld. (Eine Implementierung der zugehörigen Objekttypen finden Sie weiter unten). Das Textfeld dient zur Anzeige eines Zählerstandes. Jedes Mal, wenn mit der Maus auf den ersten Button geklickt wird, soll der Zähler um 1 erhöht werden. Wird mit der Maus auf den zweiten Button geklickt, soll der Zähler um 1 erniedrigt werden. import java.awt.*; import java.awt.event.*; class ZaehlerIncButton extends Button { public ZaehlerIncButton() { super ("Zaehler erhoehen"); this.setforeground (Color.blue); class ZaehlerDecButton extends Button { public ZaehlerDecButton() { super ("Zaehler erniedrigen"); this.setforeground (Color.red); class ZaehlerTextFeld extends TextField { private int zaehler = 0; public ZaehlerTextFeld() { String zaehlerstand; zaehlerstand = Integer.toString(zaehler); this.settext (zaehlerstand); this.setforeground(color.blue); this.setfont(new java.awt.font("sansserif", 0, 24)); public void erhoehezaehler () { String zaehlerstand; zaehler ++; zaehlerstand = Integer.toString(zaehler); this.settext (zaehlerstand); public void erniedrigezaehler () { String zaehlerstand; zaehler --; zaehlerstand = Integer.toString(zaehler); this.settext (zaehlerstand); public class Test { public static void main(string[] args) { Label zaehlertext = new Label ("Aktueller Zaehlerstand :"); zaehlertext.setbackground(color.white); zaehlertext.setforeground(color.blue); zaehlertext.setfont(new java.awt.font("sansserif", 0, 14));
Klausur zum Kurs 1618 im Sommersemester 2002 am 10.8.2002 3 ZaehlerIncButton zaehlerincbutton = new ZaehlerIncButton(); ZaehlerDecButton zaehlerdecbutton = new ZaehlerDecButton(); ZaehlerTextFeld zaehlertextfeld = new ZaehlerTextFeld(); Panel buttonpanel = new Panel(); buttonpanel.setlayout(new FlowLayout()); buttonpanel.add (zaehlerincbutton); buttonpanel.add (zaehlerdecbutton); BorderLayout borderlayout1 = new BorderLayout(); Frame f = new Frame (); f.setsize (300,200); f.setlocation (100,100); f.setlayout(borderlayout1); f.add (zaehlertext, BorderLayout.NORTH); f.add (zaehlertextfeld, BorderLayout.CENTER); f.add (buttonpanel, BorderLayout.SOUTH); f.addwindowlistener(new WindowAdapter() { public void windowclosing (WindowEvent e) { System.exit (0); ); f.setvisible (true); Aufgaben: a) Erläutern Sie, welche Funktionalitäten ein Objekt zur Verfügung stellen muss, um als Quelle für eine bestimmte Ereignissorte ES fungieren zu können. (5 Punkte) b) Welche Funktionalitäten muss ein Objekt zur Verfügung stellen, das als Beobachter einer Ereignissorte ES verwendet werden soll? c) Welche Aktivitäten sind nötig, damit ein Objekt (z.b. das Textfeld) tatsächlich beim Auftreten eines Ereignisses der Ereignissorte ES von der Ereignisquelle (z.b. einem der Buttonobjekte) benachrichtigt werden kann? d) Welche Ereignissorte des AWT muss von den Buttonobjekten und dem Textfeld unterstützt werden, um die in der Aufgabenstellung beschriebene Funktionalität zu ermöglichen? (1 Punkte) e) Erweitern Sie die oben angegebene Implementierung um alle Programmteile, die nötig sind, damit der Zählerstand bei einem Mausklick auf zaehlerincbutton erhöht und bei einem Mausklick auf zaehlerdecbutton erniedrigt wird. zaehlertextfeld soll dabei zum Beobachter an den beiden Buttonobjekten werden. Wenn für eine der angegebenen Klassen keine Änderungen nötig sind, begründen Sie, warum dies der Fall ist. (13 Punkte)
Klausur zum Kurs 1618 im Sommersemester 2002 am 10.8.2002 4 Aufgabe 4: Ausnahmebehandlung (40 Punkte) a) Gegeben sei folgendes Muster für eine Methodenimplementierung: public void MethodenBezeichner (ParamTyp1 param1,..., ParamTypN paramn ) { Anweisung a1... Anweisung ak try try-block catch ( AusnahmeTyp1 Bezeichner1 ) catch-block1... catch ( AusnahmeTypN BezeichnerN ) catch-blockn finally finally-block Anweisung b1... Anweisung bl Beantworten Sie bitte folgende Fragen: 1. Wozu wird die try-anweisung eingesetzt und welche Vorteile bietet sie z.b. gegenüber den Möglichkeiten in PASCAL 1? 2. Wann ist es zulässig, dass zu einer Ausnahme, die in einem try-block auftreten kann, keine zugehörige catch-klausel existiert? 3. Wir nehmen an, dass zu einer Ausnahme vom Typ E mindestens eine passende catch-klausel existiert. Wie wird die catch-klausel bestimmt, die diese Ausnahme behandelt? (2 Punkte) 4. Wie werden Ausnahmen behandelt, zu denen es keine passende catch-klausel gibt? Gehen Sie dabei der Einfachheit halber davon aus, dass die Ausnahmen nicht in einem catch- oder finally-block auftreten. (6 Punkte) 5. Wann wird die finally-klausel ausgeführt? (2 Punkte) 6. In welchen Fällen wird die auf eine try-anweisung folgende Anweisung (hier Anweisung b1) ausgeführt? (2 Punkte) 1 Tipp: abrupte Terminierung, Schichtenarchitektur
Klausur zum Kurs 1618 im Sommersemester 2002 am 10.8.2002 5 b) Gegeben sei das folgende Java-Programm: 1: package exceptions; 2: 3: class OverflowException extends Exception { 4: public OverflowException () { 5: super ("Produkt groesser als 100"); 6: 7: 8: 9: class DivisionException extends Exception { 10: public DivisionException () { 11: super ("Division durch faktor nicht ohne Rest moeglich"); 12: 13: 14: 15: public class TestExceptions { 16: private int faktor = 1; 17: 18: public TestExceptions (int newfaktor) { faktor = newfaktor; 19: 20: public int m1 (int i) throws OverflowException { 21: int j = i * faktor; 22: if ((j < -100) (j > 100)) { throw new OverflowException (); 23: else return j; 24: 25: 26: public int m2 (int i) throws DivisionException { 27: if (i % faktor == 0) { return (i / faktor); 28: else { throw new DivisionException (); 29: 30: 31: public int m3 (String st) { 32: try { 33: int i = Integer.parseInt(st); 34: if ( i < 30 && i > -30) { return m1 (i); 35: else if ( i >= 40 && i <= 100 ) { return m2 (i); 36: 37: catch (OverflowException oe) { 38: System.out.println(oE.getMessage()); 39: return -1; 40: 41: catch (DivisionException de) { 42: System.out.println(dE.getMessage()); 43: return -1; 44: 45: finally { System.out.println("Welches Ergebnis wird zurueckgeliefert?"); 46: System.out.println("Aus die Maus!"); 47: return 0; 48: 49:
Klausur zum Kurs 1618 im Sommersemester 2002 am 10.8.2002 6 50: public static void main(string[] args) { 51: TestExceptions testexceptions = new TestExceptions(15); 52: String[] starray = {"Ihnen", "viel", "Glueck!"; 53: int i; 54: try { 55: i = testexceptions.m2(45); 56: System.out.println ("aktueller Arrayindex :" + i); 57: starray[i] = starray[i].touppercase(); 58: System.out.println ("Wert an Position " + i + " : " + starray[i]); 59: 60: catch (NumberFormatException e) {System.out.println ("NumberFormatException"); 61: catch (ArrayIndexOutOfBoundsException e) { 62: System.out.println ("Index nicht im gueltigen Bereich"); 63: catch (Exception e) {System.out.println ("Welche Exception wurde gefangen?"); 64: try { System.out.println ("Ergebnis von m1(m2(75)): " 65: + testexceptions.m1(testexceptions.m2(75))); 66: 67: catch (OverflowException e2) {System.out.println (e2.getmessage()); 68: catch (DivisionException e2) {System.out.println (e2.getmessage()); 69: finally { 70: try { 71: i = testexceptions.m1(5); 72: i = testexceptions.m3("08.00"); 73: 74: catch (NumberFormatException e3) {System.out.println ("Kein Integer"); 75: catch (Exception e3) {System.out.println (e3.getmessage()); 76: 77: System.out.println ("Ist jetzt endlich Schluss???"); 78: 79: Aufgaben: 1. Welche Systemausgaben werden durch Abarbeitung des Programms erzeugt? (6 Punkte) 2. Beschreiben Sie detailliert, was bei der Ausführung des Programms passiert, d.h. welche Exceptions auftreten, wo diese abgefangen und behandelt werden und warum die Systemausgaben aus 1. erzeugt werden. Nehmen Sie dabei Bezug auf die angegebenen Zeilennummern. (16 Punkte)