Dieser Anhang enthält die Antworten auf die Quiz-Fragen aus den einzelnen Kapiteln. Beachten Sie, daß es in Kapitel 1 kein Quiz gab.
a. Booleschen Variablen können numerische Werte zugewiesen werden.
Antwort Falsch. In Java können Booleschen Variablen keine numerischen Werte zugewiesen werden. Sie können nur die Werte true oder false annehmen.
b. Der Additionsoperator hat eine höhere Priorität als der Multiplikationsoperator.
Antwort Falsch. Der Additionsoperator hat keine höhere Priorität als der Multiplikationsoperator. Verwechseln Sie in Tabelle 2.6 für die Operatorprioritäten nicht die unären Plus- und Minusoperatoren mit binären Infix-Additions- und Subtraktionsoperatoren.
c. Die Elemente eines Arrays können unterschiedliche Datentypen haben.
Antwort Falsch. Die Elemente eines Arrays müssen gleiche Datentypen haben.
d. Eine if-else-Bedingung kann einen Integer oder einen Booleschen Wert zurückgeben.
Antwort Falsch. Eine if-else-Bedingung kann nur einen Booleschen Wert zurückgeben.
e. Solange Sie den resultierenden Wert in einen int umwandeln können, können Sie in der Bedingung einer switch-Anweisung einen Ausdruck verwenden.
Antwort Richtig. Solange Sie den resultierenden Wert in einen int umwandeln können, können Sie einen Ausdruckt in der Bedingung einer switch-Anweisung verwenden.
Antwort Anweisungen werden durch geschweifte Klammern ({}) als Gruppe gekennzeichnet.
Antwort Indizes beginnen in Java mit 0.
int scores[] = new int[10];
int a = 3;
int b = 5;
scores[a-b];
Antwort Er wirft zur Laufzeit eine NegativeArraySizeException auf, weil der Integerausdruck im Index -2 ergibt, was keinen gültigen Wert darstellt.
char chArr[] = { 'I', 'n', 't', 'e', 'r', 'n', 'e', 't' };
String wwwStr = new String(chArr);
int wwwStrLength = wwwStr.length();
Antwort 8, weil wwwStr der Wert von chArr zugewiesen wird, der acht Zeichen umfaßt.
String firstStr = "Hier bin ich!"
String secondStr = "Nein, hier bin ich!!"
String thirdStr = "Hier bin ich!"
Antwort Er erzeugt nur zwei Strings im Speicher. Zuerst wird ein String mit dem Inhalt »Hier bin ich!« erzeugt, und ein zweiter mit dem String »Nein, hier bin ich!!«. Aufgrund der String-Optimierung von Java zeigen firstStr und thirdStr auf denselben String-Wert im Speicher.
Antwort Weil Sie die Variable in einem Anweisungsblock deklariert haben, ist sie nur im lokalen Gültigkeitsbereich des Blocks definiert. Nachdem der Block die Ausführung beendet hat, ist der Wert der Variablen undefiniert (sie existiert nicht mehr).
for (i = 0; i <= 100; i += 15);
System.out.println("Hidey, hidey, hidey, ho!");
Antwort Sie wird siebenmal durchlaufen, gibt aber nichts aus. Nachdem die for-Schleife die achte Auswertung beendet hat, wird die println-Anweisung ausgeführt.
Haben Sie das Semikolon (;) am Ende der ersten Codezeile vermißt? Es bewirkt, daß die println-Anweisung außerhalb des Gültigkeitsbereichs der for-Schleife stattfindet.
Antwort Wenn Sie den Rumpf einer Schleife ausführen wollen und dann erneut, bis eine bestimmte Bedingung true ist, sollten Sie eine do-while-Schleife verwenden.
Antwort Sie sollten vermeiden, zu viele angepaßte Klassen in Ihren Applets zu verwenden, weil sie von diesen angepaßten Klassen abhängig sind, auf die die Anwender, die Ihre Applets herunterladen, wahrscheinlich keinen Zugriff haben. Damit Ihre Applets garantiert in jedem Java-fähigen Browser ausgeführt werden, sollten Sie bei den Standard-Bibliotheksklassen bleiben.
Antwort Wenn Sie keine Oberklasse spezifizieren, erbt Ihre Klasse standardmäßig von Object.
Antwort Falsch. Java unterstützt keine Mehrfachvererbung, sondern nur Einfachvererbung. Das bedeutet, eine Unterklasse kann nur eine Oberklasse haben.
boolean aBoolean = true;
Boolean boolObject = new Boolean(aBoolean);
Antwort Die erste Codezeile initialisiert eine einfache Boolesche Variable namens aBoolean mit dem Wert true. Die zweite Codezeile instantiiert das Boolesche Objekt boolObj und weist ihr den aktuellen Wert von aBoolean zu, true.
Antwort Wenn eine Klasse das Überladen von Methoden nutzt und mehrere Methoden mit demselben Namen enthält, wird die Methode anhand der Signatur ausgewählt. Die Methodensignatur beinhaltet den Typ und die Anzahl der Argumente der Definition.
Antwort Um eine Klassenvariable zu deklarieren, verwenden Sie das Schlüsselwort static.
Antwort Das Schlüsselwort this verweist auf die aktuelle Objektinstanz. Das Schlüsselwort super verweist auf die Oberklasse der aktuellen Klasse.
Antwort Die Methode this() ruft den Konstruktor der aktuellen Klasse auf. Wenn es mehrere Konstruktoren gibt (d.$%$h. die Klasse enthält überladene Konstruktoren), ruft die Methode this() denjenigen auf, der der Methodensignatur mit der übereinstimmenden Argumenteliste entspricht.
Die Methode super() ruft den Konstruktor der Oberklasse auf. Wenn es mehrere Konstruktoren in der Oberklasse gibt (d.$%$h. sie hat überladene Konstruktoren), ruft die Methode super() denjenigen auf, der der Methodensignatur mit der übereinstimmenden Argumenteliste entspricht. .
a. Wenn Sie eine Konstante deklarieren und diese global für alle Instanzen der Klasse machen wollen, müssen Sie die Schlüsselwörter static und final angeben.
Antwort Richtig. Um eine Konstante zu deklarieren, müssen Sie nur den Modifier final verwenden. Wenn Sie dagegen wollen, daß die Konstante als globaler Wert allen Instanzen der Klasse, in der er deklariert wurde, zur Verfügung steht, müssen Sie auch den Modifier static verwenden.
b. Alle Klassen, die zu einem bestimmten Paket gehören, müssen in derselben Datei deklariert werden.
Antwort Falsch. Jede public-Klasse sollte in einer separaten .java-Quelldatei abgelegt werden, so daß sie korrekt in eine separate .class-Datei kompiliert werden kann. Um sicherzustellen, daß eine Klasse ein Element eines Pakets wird, schreiben Sie die package-Anweisung oben in jede .java-Quelldatei.
c. Eine Klasse kann nur eine Schnittstelle implementieren.
Antwort Falsch. Schnittstellen, die keine andere Schnittstelle erweitern, werden zu einer Top-Level-Schnittstelle und erweitern nicht automatisch Object.
Antwort Das war eine Scherzfrage. Sie können keine Klassenmethode deklarieren und es Unterklassen erlauben, sie zu überschreiben. Beachten Sie, daß Klassenmethoden standardmäßig final sind und in Unterklassen nicht überschrieben werden können. Um die Klassenmethode zu deklarieren, verwenden Sie vor dem Rückgabetyp der Methode das Schlüsselwort static.
Antwort Um eine Variable zu deklarieren, die read-only ist, verwenden Sie die Zugriffsmethoden, um die Variable zu ermitteln und zu setzen; dazu machen Sie die Methode zum Setzen private und die Methode zum Ermitteln public. Das ist auch eine gute Übung für Sie, weil die Zugriffsmethoden die Variable indirekt ändern, und sie damit daran hindern, ihre Darstellung zu verändern.
Antwort Der einzige Teil einer abstrakten Methode, die Sie in der abstrakten Klasse deklarieren müssen, ist die Methodensignatur. Mit anderen Worten, Sie müssen nur die Modifier, den Rückgabetyp, den Methodennamen und die Argumente (falls es solche gibt) deklarieren. Den Rumpf der abstrakten Methode brauchen Sie nicht zu deklarieren. Ihr Rumpf wird definiert, wenn die Unterklasse die abstrakte Methode implementiert.
Antwort Um alle java.util-Klassen und -Unterklassen zu importieren fügen Sie die folgende Anweisung in Ihren Quellcode ein:
Um das Unterpaket zip von java.util zu importieren, fügen Sie die folgende Anweisung in Ihren Quellcode ein:
Beachten Sie, daß der Stern (*) Ihnen ermöglicht, ein ganzes Paket mit Klassen und Unterklassen zu importieren, dessen Unterpakete nicht importiert. Jedes Paket und Unterpaket muß in einer eigenen import-Anweisung deklariert werden.
Antwort Die package-Anweisung gehört ganz oben in die Quellcodedatei (bis auf Kommentare oder Whitespaces). Ihre import-Anweisungen sollten unmittelbar hinter der package-Anweisung folgen (falls es solche gibt).
Antwort Wenn Sie im Navigations-Bereich des AppBrowsers eine .java-Datei selektieren, werden im Struktur-Bereich ihre Klassen, Methoden, Ressourcen und Import-Dateien angezeigt. Auf der Quelltext-Registerkarte im Inhalts-Bereich wird der Quellcode angezeigt.
Antwort Der Visual Designer wird durch Auswahl der Registerkarte Design im Inhalts-Bereich ausgewählt, wenn Sie im Navigations-Bereich einen Frame-Knoten selektiert haben. Der Menü-Designer wird entweder durch Doppelklicken auf ein Menüelement im Komponentenbaum-Feld aktiviert, oder durch Klicken mit der rechten Maustaste und Auswahl von Designer aktivieren im Popup-Menü.
Antwort Der Befehl Aktualisieren kompiliert die Dateien aus einem Projekt, wenn die .class-Datei älter als die .java-Quellcodedatei ist, oder wenn es noch keine .class-Datei gibt.
Antwort Um den Visual-Designer-Modus im AppBrowser zu aktivieren, klicken Sie im Inhalts-Bereich auf die Registerkarte Design, wenn im Navigations-Bereich ein Frame-Knoten selektiert ist.
Antwort Um zwischen Menü-Designer und Designer umzuschalten, doppelklicken Sie auf eine der Komponenten im Menü- oder Benutzeroberflächen-Knoten im Kontextbaum (im Struktur-Bereich).
Antwort Ein exklusives Kontrollkästchen ist programmtechnisch mit anderen Kontrollkästchen-Komponenten verwandt und hängt nicht von diesen ab. Für ein nicht-exklusives Kontrollkästchen ist die checkboxGroup-Eigenschaft gesetzt, wodurch es zu einem Element einer Gruppe von Checkbox-Komponenten wird. Um eine Gruppe nicht-exklusiver Checkbox-Komponenten zu erzeugen, so daß diese zu Optionsfeldern werden, müssen Sie die CheckboxGroup-Komponente einfügen und die checkboxGroup-Komponenten von Checkbox für diese CheckboxGroup-Komponente setzen.
Antwort Richtig. Panel-Komponenten dürfen auf XYLayout gesetzt sein, wenn Sie Ihr Programm veröffentlichen. Das ist jedoch nicht zu empfehlen. Sie sollten immer eines der Standard-Layouts verwenden, bevor Sie eine Anwendung veröffentlichen.
Antwort Der BorderLayout-Manager ordnet Ihre Komponenten gemäß der Himmelsrichtungen an: North, South, East, West und Center.
Antwort Sie können die <name>-Eigenschaft einer Komponente nicht zur Laufzeit ändern, weil es sich dabei nicht um eine echte Eigenschaft handelt. Vielmehr ist es eine Pseudo-Eigenschaft, die Ihnen ermöglicht, den Komponenten-Bezeichner in dem gesamten von JBuilder erzeugten Code zu ändern.
Antwort Die ChoiceControl-Komponente stellt eine Dropdown-Auswahlliste dar. Sie ist vergleichbar der Choice-Komponente auf der AWT-Seite.
Antwort TabsetControl- und TabsetPanel-Komponenten sind ähnlich den exklusiven Kontrollkästchen, weil sie sich wie Optionsfelder verhalten; es kann jeweils nur eine Registerkarte/Seite/Kontrollkästchen selektiert sein.
Antwort Eine datenbezogene Komponente besitzt die Möglichkeit, Daten aus einer Datenbanktabelle anzuzeigen und z.T. auch zu bearbeiten (in der Regel durch die dataSet-Eigenschaft).
Antwort Die show-Methode zeigt einen Dialog an. Diese Methode sollte im Ereignis-Handler der Komponente aufgerufen werden, die den Dialog aufruft, etwa eine Schaltfläche oder ein Menüelement.
Antwort Die fünf wichtigsten Methoden, die ein Abbildung überschreiben kann, sind init(), start(), stop(), destroy() und paint(). Die einzige davon, die Ihr Applet wirklich überschreiben muß, ist paint(), weil es sonst keine sichtbare Präsenz auf der Web-Seite besitzt.
Antwort Dieser Text stellt die alternative Meldung dar, die angezeigt wird, wenn Ihr Applet von einem Browser ausgeführt wird, der nicht Java-fähig ist. Auf diese Weise ist sichergestellt, daß der Leser nicht einfach nur ein leeres Feld sieht. Die Angabe ist optional, aber sehr zu empfehlen.
Antwort Das CODEBASE-Attribut kann im <APPLET>-Tag genutzt werden, um der HTML-Seite mitzuteilen, daß sie in einem anderen Verzeichnis nach den Klassendateien des Applets zu suchen. Das Verzeichnis wird als String angegeben, und der Pfadname ist relativ zum Verzeichnis der HTML-Datei.
Antwort Richtig. Alle Applet-Parameter werden dem Applet als Strings übergeben. Wenn Sie einen anderen Datentyp dafür brauchen, müssen Sie im Applet-Rumpf Code schreiben, der sie entsprechend umwandelt.
Antwort Falsch. Diese Codezeile zeichnet ein ausgefülltes Rechteck mit der oberen linken Ecke am Punkt 20,20, und mit der unteren rechten Ecke an dem Punkt 79,79.
Sie wissen, daß die beiden letzten Argumente die Höhe und die Breite angeben, keine Koordinaten. Vergessen Sie nicht, die Anfangskoordinaten ebenfalls als Pixel im ausgefüllten Rechteck mitzuzählen (Pixel 20 bis 79 ergeben genau 60 Pixel.)
Antwort Richtig. Sie können den Umriß eines Kreises mit den Methoden drawRoundRect() oder drawOval() zeichnen. Hier folgt ein Beispiel für eine paint()-Methode, die beide Methoden nutzt, um einen Kreist von 60x60 Pixeln zu zeichnen.
public void paint(Graphics g) {
g.drawRoundRect(20,20,60,60,30,30);
g.drawOval(120,20,60,60);
}
Es ist natürlich einfacher, drawOval() zu verwenden, weil diese Methode weniger Argumente verarbeitet.
Antwort Sie können die getStyle()-Methode verwenden und die von ihr zurückgegebene Integer-Konstante auswerten. Wenn sie 3 zurückgibt, ist der Stil des Font-Objekts fett kursiv.
setForeground(getBackground());
Antwort Die folgende Codezeile löscht in einem Applet alles, was bisher gezeichnet wurde:
setForeground(getBackground());
Durch Ermittlung der Hintergrundfarbe und Anpassen der Vordergrundfarbe stellen Sie alle bisher gezeichneten Grafiken in der Hintergrundfarbe und löschen sie damit. Wenn Sie die aktuelle Zeichenfarbe auf die Hintergrundfarbe setzen wollen (wie es Zeichenprogramme tun, wenn sie ein Radiergummi-Werkzeug implementieren), könnten Sie etwa die folgende Codezeile verwenden:
Antwort Falsch. Streams und Dateien können DataInput und DataOutput verwenden, weil diese Schnittstellen von den Klassen DataInputStream, DataOutputStream und RandomFileAccess implementiert werden.
Antwort Eine veraltete Klasse wird nicht mehr verwendet und bleibt nur der Abwärtskompatibilität halber definiert.
Antwort Auch wenn noch einige Methoden von der Existenz der Klasse PrintStream abhängig sind (insbesondere System.out.println()), wurde sie im JDK 1.1 durch PrintWriter ersetzt. Das bedeutet, Ihre Programme sollten statt PrintStream die Klasse PrintWriter verwenden, wann immer das möglich ist.
Antwort Führen Sie eine bedingte Kompilierung aus, so daß nur die Quellcodedateien kompiliert werden, die keine aktuellen .class-Dateien haben. Durch Neuerstellen wird alles kompiliert, unabhängig vom Status der .class-Dateien.
Antwort Es gibt mehrere Möglichkeiten, einen Haltepunkt in einer Zeile des Quellcodes zu setzen. Mit dem Cursor in der Quellcodezeile können Sie mit der rechten Maustaste auf die Zeile klicken und den Befehl Haltepunkt umschalten im Popup-Menü des Editors wählen. Sie könnten aber auch Ansicht | Haltepunkte auswählen, um das Haltepunkte-Fenster anzuzeigen und dann mit der rechten Maustaste klicken und den Dialog Haltepunktoptionen auswählen, um den gewünschten Haltepunkt zu setzen. Sie können aber auch den Befehl Start | Haltepunkte setzen, um den Haltepunktoptionen-Dialog aufzurufen und den gewünschten Haltepunkt zu setzen.
Antwort Der Befehl Routine verfolgen ermöglicht Ihnen, beim Debugging alle Zeilen einer Methode auszuführen. (Wenn Sie die Methode verfolgen und es sich dann anders überlegen, wählen Sie Ausführung bis Ende der Methode, um die restlichen Zeilen des Codes in der Methode als Gruppe auszuführen.)
Antwort Um den Wert einer Variablen zur Laufzeit zu ändern, wählen Sie Start | Auswerten/Ändern, um den Dialog Auswerten/Ändern anzuzeigen, geben den neuen Wert ein und klicken auf die Schaltfläche Ändern.
Antwort Falsch. Der Ausführungspunkt gibt die Codezeile an, die als nächstes ausgeführt wird.
Antwort Wählen Sie den Menüeintrag Start | Ausführung bis Cursorposition.
Antwort Um in der IDE einen Ereignis-Handler zu erzeugen, wählen Sie die Komponente in der Design-Registerkarte des AppBrowsers. Klikken Sie auf die Ereignisse-Registerkarte und klicken Sie dreimal auf das betreffende Ereignis. Dadurch wird der Methodenheader eingefügt, wo Sie Ihren Code für die Ereignisverarbeitung eintragen können.
Antwort True. Ein MouseClicked-Ereignis wird nicht erzeugt, wenn zwischen dem Drücken und dem Loslassen der Maustaste ein MouseDragged-Ereignis stattgefunden hat.
Antwort Für das Ereignis keyTyped.
Antwort Schreiben Sie den Namen der gewünschten Ereignis-Handler-Methode in die rechte Spalte Ereignisses, das diese nutzen soll.
Antwort Nein. Einem try-Block könnten catch-Blöcke oder ein finally-Block folgen, nicht beides.
Antwort throws in einer Methodensignatur warnt den Compiler, daß der Aufrufer dieser Methode entweder die in der throws-Klausel aufgelisteten Ausnahmen auffangen muß, oder daß er diese Ausnahmen in seiner eigenen throws-Klausel aufrufen muß. Das Schlüsselwort throw wird eine Ausnahme während der Ausführung auf oder neu auf.
Antwort Falsch. Wenn Sie eine Ausnahme auffangen, müssen Sie gar keine Verarbeitung dafür ausführen.
Antwort JDBC-ODBC-Brücke, Eigenes Java-API, Neutrales Netzwerkprotokoll und eigenes Netzwerkprotokoll.
Antwort Mit Hilfe eines DataModule können Sie die darin enthaltenen Komponenten als Gruppe behandeln.
Antwort In einer datenbezogenen Komponente muß die DataSet-Eigenschaft auf die zugrunde liegende Datenzugriffs-Komponente gesetzt werden, um die Verbindung einzurichten.
(c) 1997 SAMS