From 5c8b9b40ceb6034f5fd6281e873cdeee6b33fd7c Mon Sep 17 00:00:00 2001 From: denkspuren Date: Mon, 9 Jan 2017 00:42:06 +0100 Subject: [PATCH] =?UTF-8?q?HTML-Dokumente=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JavaFragen.Antworten.html | 6422 +++++++++++++++++++++++++++++++++++++ JavaFragen.html | 4088 +++++++++++++++++++++++ 2 files changed, 10510 insertions(+) create mode 100644 JavaFragen.Antworten.html create mode 100644 JavaFragen.html diff --git a/JavaFragen.Antworten.html b/JavaFragen.Antworten.html new file mode 100644 index 0000000..da70e8c --- /dev/null +++ b/JavaFragen.Antworten.html @@ -0,0 +1,6422 @@ + + + + + + + + +Lernfragen zu Java + + + + + + +
+
+

Hinweis

+
+
+

Dieser Fragenkatalog enthält zahlreiche Fragen und Antworten zu dem Java-Programmierbuch von Michael Kofler, Java: Der Grundkurs, Rheinwerk, 2015. Die Kapitelordnung dieses Fragenkatalogs orientiert sich an den Kapiteln des Buchs von Michael Kofler, so dass Sie einen einfachen Bezug zwischen dem Buch und den Fragen herstellen können.

+
+
+

Der Fragenkatalog ist das Ergebnis der Projektwoche, die wir vom 2.-6. Januar 2017 mit den Studierenden der Veranstaltung "Objektorientierte Programmierung" (Erstsemester Informatik) an der Technischen Hochschule Mittelhessen (THM) durchgeführt haben. Wir haben in der Projektwoche den gesamten bisher gelernten Java-Stoff aus dem Wintersemester 2016/17 wiederholt. Als Grundlage zur Wiederholung diente das Java-Buch von Michael Kofler.

+
+
+

Wir möchten diesen Fragenkatalog allen Programmierinteressierten zur Verfügung stellen. Die Fragen sollen Ihnen beim Reflektieren des Gelesenen und beim Festigen Ihres Java-Wissens helfen.

+
+
+

Während der Projektwoche haben wir das Buch von Michael Kofler gemeinsam mit den Studierenden gelesen, dabei live die Fragen erstellt und anschließend die Antworten besprochen und dokumentiert. Manch eine Frage und manch eine Antwort muss überarbeitet werden, sicher ist uns manch ein Fehler unterlaufen. Helfen Sie uns dabei, den Fragenkatalog zu verbessern!

+
+
+

Dominikus Herzberg, @denkspuren

+
+
+
+

1. Hello World!: Java-Crashkurs [Kap. 1.8]

+
+
+

1.1. Frage

+
+

String x = "abc"; Wo ist das new zur Instanziierung?

+
+
+
Antwort
+

Der Ausdruck "abc" ist ein Literal, das eine Abkürzende Schreibweise für den Konstruktoraufruf mit new darstellt.

+
+
+
+

1.2. Frage

+
+

Wie unterscheidet sich ein Javadoc-Kommentar von normalen Kommentaren?

+
+
+
Antwort
+

Javadoc-Kommentare können automatisch weiterverarbeitet werden, z.B. von IDEs wie Eclipse oder IntelliJ. Die HTML-API von Java wurde ebenfalls aus den Javadoc-Kommentaren generiert.

+
+
+
+

1.3. Frage

+
+

Was ist ein Schlüsselwort?

+
+
+
Antwort
+

Ein reservierter Begriff, der nicht für Bezeichner verwendet werden kann, weil er in Sprachkonstrukten gebraucht wird (z.B. if, for, class).

+
+
+
+

1.4. Frage

+
+

Never use Dollars in Javaland. Why?

+
+
+
Antwort
+

Dollars werden für automatisch generierten Code verwendet.

+
+
+
+

1.5. Frage

+
+

for(int i=0; i⇐10; i++);. Wo ist das Problem?

+
+
+
Antwort
+

Die Schleife tut gar nichts, weil der Körper aus einer leeren Anweisung (Semikolon) besteht.

+
+
+
+

1.6. Frage

+
+

Das ; (Semikolon) beendet eine _?

+
+
+
Antwort
+

Anweisung

+
+
+
+

1.7. Frage

+
+

Das + bei Strings ist ein _-Operator

+
+
+
Antwort
+

Konkatenations-Operator

+
+
+
+

1.8. Frage

+
+

Wenn jede Anweisung mit einem Semikolon beendet werden muss, gilt das auch für if oder while?

+
+
+

Bsp.: if (x < 0); x = 0; (Was macht dieser Code?)

+
+
+
Antwort
+

Wenn das if greift, wird es von einer leeren Anweisung ; gefolgt — insofern bleibt das if wirkungslos. Der sich anschließende Ausdruck x = 0; wird immer ausgeführt.

+
+
+
+

1.9. Frage

+
+

Warum kann man die Klasse Math verwenden, ohne sie vorher zu importieren?

+
+
+
Antwort
+

Weil sie im Paket java.lang definiert ist, das immer importiert wird.

+
+
+
+

1.10. Frage

+
+

Wann kommt ein Punkt . vor den Klassennamen?

+
+
+
Antwort
+

Wenn die Klasse in einem (noch nicht importierten) Paket definiert ist.

+
+
+
+

1.11. Frage

+
+

Auf S.54 steht was zur Option -encoding. In welchem Aufgabenblatt gibt es dazu eine Anmerkung?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

1.12. Frage

+
+

Auf S.52 unten heißt es: "Java kennt keine Eigenschaften." Auf S.57 unten jedoch: "Über Attribute können Eigenschaften von Objekten gelesen bzw. gespeichert werden." Was ist da los? Ein Widerspruch?

+
+
+
Antwort
+

Der Begriff "Eigenschaften" ist hier doppelt belegt. Im ersten Satz ist das englische property gemeint, womit ein Sprachkonstrukt bezeichnet wird, das es in Java nicht gibt. Im zweiten Satz geht es tatsächlich um "Eigenschaften" im umgangssprachlichen Sinne, also um Felder von Objekten. Leider werden diese Begriffe nicht immer einheitlich verwendet.

+
+
+
+

1.13. Frage

+
+

import paket.; Was meint der Stern in der import-Anweisung?

+
+
+
Antwort
+

Der Stern importiert alle Klassen in dem jeweiligen Paket.

+
+
+
+

1.14. Frage

+
+

S.59 im Code: DateTimeFormatter.ofPattern( "EEEE, d. MMMM yyyy" ); Häh?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

1.15. Frage

+
+

Warum kann man keine Instanz der Klasse Math erzeugen?

+
+
+
Antwort
+

Der Konstruktor von Math ist nicht public und damit ist keine Instanz von Math erzeugbar.

+
+
+
+

1.16. Frage

+
+

Warum muss man überhaupt import verwenden?

+
+
+
Antwort
+

Weil Klassen in Paketen organisiert sind. Dadurch ist es möglich, nur die Klassen zu laden, die auch benötigt werden. Gäbe es diese Paketorganisation nicht, müsste man außerdem immer aufpassen, dass Namen von eigenen Klassen nicht identisch sind mit dem Namen irgendeiner Klasse irgendwo in der Java-API.

+
+
+
+
+
+

2. Variablenverwaltung

+
+
+

2.1. Frage

+
+

Was heißt final als Teil einer Variablendefinition genau?

+
+
+
Antwort
+

Einer Variablen darf nur genau einmal ein Wert zugewiesen werden. Aber Achtung, siehe S. 83: Wenn der Wert nicht primitiv, sondern ein Referenztyp ist, so kann die Referenz zwar nicht mehr geändert werden, wohl aber kann es möglich sein, die Felder des referenzierten Objekts zu verändern!

+
+
+
+

2.2. Frage

+
+

System.out. println(" Umfang: " + umfang);

+
+
+

Hier kommt ein Ausdruck der Form String + double vor. Welchen Effekt hat dieser Ausdruck?

+
+
+
Antwort
+

Der +-Operator wird hier aufgrund des String-Operanden als Konkatenation interpretiert. Der double-Wert wird im Hintergrund als Typ angepasst und in seiner Representation als Zeichenkette gewandelt.

+
+
+
+

2.3. Frage

+
+

Code auf S.63 oben: Wenn ich das in der JShell eingebe, gibt es gar keine Probleme. Irrt Herr Kofler, dass es da ein Problem geben kann?

+
+
+
Antwort
+

Normalerweise haben Variablen Default-Werte, und alles geht gut:

+
+
+
+
jshell> int x,y,z;
+x ==> 0
+y ==> 0
+z ==> 0
+
+jshell> x = 3;
+x ==> 3
+
+jshell> y = x + z;
+y ==> 3
+
+
+
+

Nicht jedoch, wenn die Variablen lokal in einem Codeblock sind. Ein Codeblock ist durch geschweifte Klammern ausgewiesen.

+
+
+
+
jshell> { int x,y,z; x = 3; y = x + z; }
+|  Error:
+|  variable z might not have been initialized
+|  { int x,y,z; x = 3; y = x + z; }
+
+
+
+
+

2.4. Frage

+
+

Seite 63: Was ist damit gemeint, dass ein float eine Fließkommazahl mit "8 Stellen" darstellt? Geben Sie Beispiele für Zahlen, die nicht darstellbar sind.

+
+
+
Antwort
+

Ein Beispiel mit acht Stellen, das funktioniert:

+
+
+
+
jshell> float x = 0.00000000010f
+x ==> 1.0E-10
+
+
+
+

Die Zahl hat mehr als acht Stellen. Was ist gemeint?

+
+
+

Es sind die acht "geltenden" Stellen gemeint, die ein float unterscheiden kann:

+
+
+
+
jshell> x = 1.1111111111f
+x ==> 1.1111112
+
+
+
+

Hier sind nur acht Stellen zu sehen. Führende oder abschließende Nullen

+
+
+
+

2.5. Frage

+
+

Unter welchem Namen findet man die Konstanten +Infinity und -Infinity in der Java-API?

+
+
+
Antwort
+
+
jshell> Double.POSITIVE_INFINITY
+$9 ==> Infinity
+
+jshell> Double.NEGATIVE_INFINITY
+$8 ==> -Infinity
+
+
+
+

Ebenso natürlich unter Float.

+
+
+
+

2.6. Frage

+
+

Warum sind Rundungsfehler bei Fließkommazahlen nicht zu vermeiden?

+
+
+
Antwort
+

Es gibt Zahlen, die haben unendlich viele Nachkommastellen, wie z.B. Pi, die bei einer endlichen Darstellung immer zu Rundungsfehlern führen.

+
+
+
+
jshell> 2/3f
+$14 ==> 0.6666667
+
+
+
+
+

2.7. Frage

+
+

Rundungsfehler machen auch einen exakten Vergleich von zwei Fließkommazahlen schwierig. Wie kann man sicher überprüfen, ob eine Variable vom Typ float oder double "gleich null" ist? Gibt es eine Lösung, die für alle denkbaren Szenarien funktioniert?

+
+
+
Antwort
+

Beispiel:

+
+
+
+
jshell> 0.1 + 0.1 + 0.1 == 0.3
+$15 ==> false
+
+
+
+

Bei Fließkommazahlen muss man sich darauf einigen, wieviele Nachkommastellen einem wichtig sind, da man um Rundungseffekte nicht herumkommt.

+
+
+
+
jshell> Math.abs(0.1+0.1+0.1-0.3) <= 0.00001
+$16 ==> true
+
+
+
+

Eine Standard-Lösung dafür gibt es nicht.

+
+
+
+

2.8. Frage

+
+

Wie sieht schematisch die Syntax zur Deklaration einer Variablen aus?

+
+
+
Antwort
+

Buch S.62 (unten): datentyp varname [ = wert ];

+
+
+
+

2.9. Frage

+
+

Warum ist das Erzeugen von Zufallszahlen in Java nicht mit statischen Methoden realisiert? Warum muss man ein Objekt der Klasse Random erzeugen?

+
+
+
Antwort
+

Der Zufall, den ein Computer erzeugt, ist deterministisch, d.h. eine Folge von Zufallszahlen wird durch einen Algorithmus berechnet. Beginnend von einem Startwert (seed) wird eine Zahlenfolge berechnet, die die Qualität einer Zufallsfolge hat, aber streng berechnet wird. Der letzte Zufallswert ist Grundlage für den nächsten Zufallswert. Dieser sogenannte Zustand wird in einer Variablen gespeichert. Um mehrere Zufallsgeneratoren betreiben zu können, wir der Generator als Objekt realisiert.

+
+
+
+

2.10. Frage

+
+

Welchen Wert haben die Variablen x, y und z nach der folgenden Definition: int x, y, z = 1;?

+
+
+
Antwort
+
+
jshell> int x, y, z = 1;
+x ==> 0
+y ==> 0
+z ==> 1
+
+
+
+

Man könnte, sobald die Variablen deklariert sind, einen gleichen Wert für alle Variablen wie folgt setzen:

+
+
+
+
jshell> x = y = z = 2
+x ==> 2
+
+jshell> x
+x ==> 2
+
+jshell> y
+y ==> 2
+
+jshell> z
+z ==> 2
+
+
+
+
+

2.11. Frage

+
+

Was ist "implizites Casting"? Geben Sie ein Beispiel.

+
+
+
Antwort
+

"Casting" heißt "Typanpassung". Implizit ist die Typanpassung dann, wenn sie von Java im Hintergrund für Sie gemacht wird. Addieren Sie z.B. einen int und einen float, so wird die Ganzzahl von Java implizit in einen Fließkommazahlenwert umgewandelt.

+
+
+
+

2.12. Frage

+
+

Was ist mit dem Begriff "Überlauf" gemeint?

+
+
+
Antwort
+

Wenn eine Rechnung den Wertbereich des Zahlentyps überschreitet, spricht man von einem (Zahlen)Überlauf. Java meldet bei einem Überlauf keinen Fehler!

+
+
+
+

2.13. Frage

+
+

Warum kann man einen int implizit zu long casten, einen long aber nicht zu int?

+
+
+
Antwort
+

Weil beim Casting von long zu int Information verloren geht. Das macht Java nicht implizit, das müssen Sie im Zweifel explizit tun — dann müssen Sie aber auch mit den möglichen Folgen leben.

+
+
+
+

2.14. Frage

+
+

Wie sieht die Syntax für einen expliziten Cast (Typumwandlung) aus?

+
+
+
Antwort
+

(typ) wert

+
+
+
+

2.15. Frage

+
+

Was versteht man unter einem "Modifizierer" bei der Variablendefinition? Geben Sie ein Beispiel an.

+
+
+
Antwort
+

Zum Beispiel modifiziert final eine Variable.

+
+
+
+

2.16. Frage

+
+

Welchen Datentyp und welchen dezimalen Wert haben die folgenden Literale?

+
+
+
    +
  • +

    10

    +
  • +
  • +

    10.0

    +
  • +
  • +

    010

    +
  • +
  • +

    0x10

    +
  • +
  • +

    0b10

    +
  • +
+
+
+
Antwort
+
    +
  • +

    10 (int, die 10)

    +
  • +
  • +

    10.0 (double, die 10.0)

    +
  • +
  • +

    010 (ein int in oktaler Kodierung, der Wert ist 8)

    +
  • +
  • +

    0x10 (ein int in hexadezimaler Kodierung, der Wert 16)

    +
  • +
  • +

    0b10 (ein int in binärer Kodierung, der Wert 2)

    +
  • +
+
+
+
+

2.17. Frage

+
+

Wie kann man den Wert "eine Million" mit drei Zeichen als Java-Literal darstellen?

+
+
+
Antwort
+

1E6

+
+
+
+

2.18. Frage

+
+

Welche Ausgabe produziert das folgende Programmstück:

+
+
+
+
int x = 10;
+{
+  System.out.println(x);
+  int x = 5;
+  System.out.println(x);
+  {
+    System.out.println(x);
+  }
+}
+
+
+
+
Antwort
+

Das Ergebnis ist: 10, 5, 5

+
+
+
+
Codeblöcke und Variablen
+
+

Codeblöcke definieren eigene Kontexte für sogenannte lokale Variablen. Ein eingegeschachtelter innerer Codeblock hat Zugriff auf die Variablen des umgebenden, äußeren Codeblocks, sofern eine namensgleiche Variable die äußere Variable nicht "überdeckt". Grundsätzlich hat jeder Codeblock Zugriff auf die Felder der Instanz bzw. der Klasse.

+
+
+
+
+
+

2.19. Frage

+
+

Im Anschluss an obigen Code: Was ergibt { int x; int x; }?

+
+
+
Antwort
+

Doppelte Variablendeklarationen sind verboten! Eine Variable kann in einem Codeblock nur genau einmal deklariert werden.

+
+
+
+

2.20. Frage

+
+

Ist es eine gute Idee, die drei Punkte eines Dreiecks mit dem folgenden Code zu initialisieren? Warum?

+
+
+
+
java.awt.Point p1, p2, p3;
+p1 = p2 = p3 = new java.awt.Point(0, 0);
+
+
+
+
Antwort
+

Alle drei Punkte haben die gleiche Referenz auf ein und dieselbe Instanz von Point. Damit entsteht niemals ein Dreieck aus drei unterschiedlichen Instanzen.

+
+
+
+

2.21. Frage

+
+

Wie könnte einer dieser ominösen auf S.77 erwähnten "Copy-Konstruktoren" für die Klasse java.awt.Point aussehen?

+
+
+
Antwort
+
+
class Point {
+  int x, y;
+  Point(Point p) {
+    this(p.x, p.y);
+  }
+  Point(int x, int y) {
+    this.x = x;
+    this.y = y;
+  }
+}
+
+
+
+

Beispiel:

+
+
+
+
jshell> Point p = new Point(4,3)
+p ==> Point@25bbe1b6
+
+jshell> Point p2 = new Point(p)
+p2 ==> Point@69ea3742
+
+
+
+

Hier sehen Sie, dass es zwei unterschiedliche Referenzen für p1 und p2 gibt.

+
+
+
+

2.22. Frage

+
+

Was sind boxing und unboxing bei Wrapper-Klassen?

+
+
+
Antwort
+

Aus einem primitiven Typ einen Referenztyp machen, aus z.B. int einen Integer, das nennt man boxing. Das Gegenteil unboxing.

+
+
+
+

2.23. Frage

+
+

Was passiert bei der Ausführung von folgendem Code:

+
+
+
+
Double x = null;
+double y = x;
+
+
+
+
Antwort
+
+
jshell> Double x = null
+x ==> null
+
+jshell> double y = x
+|  java.lang.NullPointerException thrown:
+|        at (#5:1)
+
+
+
+
+

2.24. Frage

+
+

Warum kann man sowohl int x = Integer.parseInt("123"); als auch Integer x = Integer.parseInt("123"); schreiben? Was ist der Unterschied?

+
+
+
Antwort
+

Rückgabetype von Integer.parseInt("123") ist ein int. Im zweiten Fall der Zuweisung zu Integer x wird ein boxing vorgenommen. Im ersten Fall ist x ein primitiver Typ, im zweiten bei Integer x ein Referenztyp. Wrapperklassen verbrauchen mehr Speicher als ihre primitiven Vorlagen.

+
+
+
+

2.25. Frage

+
+

Was passiert bei folgender Deklaration Double x = 10;? Warum?

+
+
+
Antwort
+

Die 10 ist der Literal für einen Integer int. Bei double x = 10 wird der int implizit auf ein double gecastet. Bei Double x = 10 (Wrapperklasse) geschieht kein implizites Casting, die Implementierung hat das nicht vorgesehen.

+
+
+
+

2.26. Frage

+
+

Gibt es einen Unterschied zwischen den folgenden beiden Codestücken?

+
+
+
+
int x = 10;
+double y = x;
+
+
+
+
+
Integer x = 10;
+Double y = x;
+
+
+
+
Antwort
+

Im ersten Snippet greift das Casting zwischen primitiven Typen. Bei den Wrapperklassen gibt es kein implizites Casting. Das zweite Snippet funktioniert nicht.

+
+
+
+

2.27. Frage

+
+

Ist Integer eine Sub- oder Superklasse von Long, oder keins von beidem?

+
+
+
Antwort
+

Es gibt keinen inneren Bezug zwischen diesen Klassen (also "keins von beidem").

+
+
+
+

2.28. Frage

+
+

Welche einzelnen Schritte müssen passieren, um eine Zahl von der Konsole einzulesen?

+
+
+
Antwort
+

Die Antwort findet sich auf S. 81:

+
+
+
    +
  1. +

    Scanner erzeugen

    +
  2. +
  3. +

    System.in als Quelle angeben

    +
  4. +
  5. +

    Auslesen mit .next()

    +
  6. +
+
+
+
+
java.util.Scanner scan = new java.util.Scanner(System.in);
+String s = scan.next();
+
+
+
+
+

2.29. Frage

+
+

Woher weiß System.out.println in dem folgenden Beispiel, wie ein Punkt auf der Konsole aussehen soll?

+
+
+
+
System.out.println(new java.awt.Point(0,0));
+
+
+
+
Antwort
+

Die Point-Klasse hat eine eigene Implementierung der toString-Methode (sie überschreibt die toString-Methode der Klasse Object), die implizit aufgerufen wird, wenn ein String`-Kontext angefragt wird.

+
+
+
+

2.30. Frage

+
+

Definieren Sie einen Enumerationstyp Ternary, der die drei Werte TRUE, FALSE, und MAYBE besitzt.

+
+
+
Antwort
+
+
enum Ternary { TRUE, FALSE, MAYBE }
+
+
+
+
+

2.31. Frage

+
+

Können Enumerationstypen auch Methoden haben? Wie sieht die Deklaration eines solchen Typs aus?

+
+
+
Antwort
+

Ja. Der Kopf sieht wie bei enum aus, der Rumpf kann aber ansonsten wie eine Klasse mit Methoden, Konstruktoren etc. ausgestattet werden.

+
+
+
+
+
+

3. Operatoren

+
+
+

3.1. Frage

+
+

Operatoren kommen nur vor in __?

+
+
+
Antwort
+

Ausdrücken

+
+
+
+

3.2. Frage

+
+

Was ist mit der Priorität eines Operators gemeint? Geben Sie ein Beispiel an.

+
+
+
Antwort
+

Die Priorität gibt die Rangfolge der Operatoren bei der Auswertung (Evaluation) an. Sie kennen aus der Arithmetik die Regel zur Rangfolge "Punkt- vor Strichrechnung".

+
+
+
+

3.3. Frage

+
+

Der Minus-Operator “-” ist linksassoziativ. Was ist damit gemeint? Erklären Sie das an einem Beispiel.

+
+
+
Antwort
+

Ein nicht vollständig geklammerter Ausdruck wird entsprechend der Assoziativität der Operatoren geklammert. Bei linksassoziativen Operatoren heißt das, dass der am weitesten links stehende Ausdruck zuerst ausgewertet wird.

+
+
+

Beispiel: 3 - 4 - 5 wird interpretiert als (3 - 4) - 5.

+
+
+
+

3.4. Frage

+
+

Was ist der Unterschied zwischen & und &&?

+
+
+
Antwort
+

Das & ist ein bitweiser Operator (Ergebnis vom Typ int bzw. long), das && ein logischer (Ergebnis vom Typ boolean).

+
+
+
+

3.5. Frage

+
+

Die Zuweisung ist ein Operator. Das heißt, die Zuweisung hat als Ergebnis einen _?

+
+
+
Antwort
+

Wert

+
+
+
+

3.6. Frage

+
+

Anschluss an vorherige Frage: Ist der Zuweisungsoperator rechts- oder linksassoziativ? Können Sie einen Grund angeben, warum es so sein muss?

+
+
+
Antwort
+

Der Zuweisungsoperator ist rechtsassoziativ. Das ist nötig, damit der Ausdruck x = y = z = 3 funktioniert.

+
+
+
+

3.7. Frage

+
+

Es gibt drei(!) Kontexte im Zusammenhang von Ausdrücken, in denen runde Klammernpaare (…​) vorkommen. Welche sind das?

+
+
+
Antwort
+

Die ersten zwei Kontexte finden Sie in der Operatoren-Tabelle. Den dritten Kontext sollten Sie nicht vergessen!

+
+
+
    +
  • +

    Casting

    +
  • +
  • +

    Methodenaufrufe

    +
  • +
  • +

    Klammerung von Ausdrücken zur Veränderung der Priorität (Rangfolge) bei der Evaluation (Auswertung) eines Ausdrucks; Beispiel: (1 + 2) * 3, denn in 1 + 2 * 3 greift die Priorität, die Sie als "Punkt- vor Strichrechnung" kennen.

    +
  • +
+
+
+

Die syntaktische Funktion von runden Klammern im Zusammenhang von Anweisungen (die Frage bezog sich auf Ausdrücke!) wie im Kopf einer Schleife, einer if-Anweisung, der Deklaration eines Methodenkopfs ist hier nicht gemeint gewesen. Die Frage bezog sich auf Ausdrücke, nicht Anweisungen!

+
+
+
+

3.8. Frage

+
+

Erklären Sie, wie die Kopfzeile im while funktioniert:

+
+
+

whileline = breader.readLine( != null) { …​ }

+
+
+
Antwort
+
    +
  1. +

    Der Variable line wird das Ergebnis des Aufrufs breader.readLine() zugewiesen.

    +
  2. +
  3. +

    Das Ergebnis dieser Zuweisung ist der neue Wert den line erhalten hat.

    +
  4. +
  5. +

    Dieser Wert wird mit null verglichen.

    +
  6. +
+
+
+
+

3.9. Frage

+
+

Angenommen, es gäbe den Modulo-Operator % in Java nicht. Wie müsste dann eine Implementierung mod(int x, int y) z.B. in der Math-Klasse aussehen?

+
+
+
Antwort
+
+
static int mod(int x, int y) {
+  int d = x / y;
+  return x - d * y;
+}
+
+
+
+

Erinnern Sie sich an das Substitutionsprinzip, das man hier anwenden kann. Der Ausdruck zur Zwischenrechnung, dessen Ergebnis in der Variablen d gespeichert wird, kann direkt im return die Variable d ersetzen. Somit wird der Rumpf der mod-Methode zu einem Einzeiler:

+
+
+
+
  return x - (x / y) * y;
+
+
+
+
+

3.10. Frage

+
+

Die Kurzform x += 3 bedeutet ausführlich was?

+
+
+
Antwort
+

x = x + 3

+
+
+
+

3.11. Frage

+
+

Erläutern Sie den Unterschied von int a = n;` zu `int a = n;!

+
+
+
Antwort
+

int a = n;` entspricht den Anweisungen `int a = n; n = n + 1;`. Bei `int a = n; dreht sich die Reihenfolge um: n = n + 1; int a = n;.

+
+
+
+

3.12. Frage

+
+

Die Vergleichoperatoren wie >, , == usw. stehen für welche Typen zur Verfügung?

+
+
+
Antwort
+

Für alle primitiven Typen außer boolean und ihre Wrappertypen.

+
+
+
+

3.13. Frage

+
+

Wann kann man die Methode compareTo verwenden?

+
+
+
Antwort
+

Wenn das Objekt das Interface Comparable implementiert.

+
+
+
+

3.14. Frage

+
+

Warum ist es keine gute Idee, zwei Zeichenketten mit == zu vergleichen?

+
+
+
Antwort
+

Weil damit die Identität der Referenzen überprüft wird, nicht aber der Inhalt des Strings. Für Strings und andere komplexe Datentypen sollte man die Methode equals verwenden.

+
+
+
+

3.15. Frage

+
+

Was ist der Unterschied von & und && bei boolschen Werten? In beiden Fällen ergibt sich immer das gleiche Ergebnis, z.B.:

+
+
+
+
jshell> true && false
+$11 ==> false
+jshell> true & false
+$12 ==> false
+
+
+
+
Antwort
+

Der Operator && ist short-circuited (engl. für kurzgeschlossen), d.h. wenn an dem linken Operanden schon zu erkennen ist, was das Ergebnis sein muss, wird der rechte Operand überhaupt nicht mehr ausgewertet.

+
+
+
+

3.16. Frage

+
+

Wandeln Sie ein if (expr1 && expr2) {…​} so um, dass Sie nur if-Anweisungen ohne den &&-Operator verwenden!

+
+
+
Antwort
+

if (expr1) if (expr2) {…​}

+
+
+
+

3.17. Frage

+
+

Gleiche Aufgabe: Umwandlung von if (expr1 || expr2) { …​ }.

+
+
+
Antwort
+

if (expr1) { …​ } else if (expr2) { …​ }

+
+
+
+

3.18. Frage

+
+

Multiplizieren Sie eine int-Zahl mit 4 ohne die Multiplikation zu verwenden.

+
+
+
Antwort
+

zahl << 2

+
+
+
+

3.19. Frage

+
+

Warum ist der ternäre-Operator nicht mit einem if zu vergleichen? Was ist anders?

+
+
+
Antwort
+

Der ternäre-Operator ist ein Ausdruck (mit einem Ergebnis), das if ist eine Anweisung (ohne Ergebnis).

+
+
+
+

3.20. Frage

+
+

Implementieren Sie eine Methode odd(int n) (odd heißt "ungerade"), die mithilfe eines Bitoperators ermittelt, ob der übergebene Integer ungerade ist oder nicht.

+
+
+
Antwort
+
+
boolean odd(int n) {
+  return n & 1 == 1;
+}
+
+
+
+
+

3.21. Frage

+
+

return b == true ? false : true; Verkürzen Sie die return-Anweisung.

+
+
+
Antwort
+

return !b;

+
+
+
+
+
+

4. Verzweigungen und Schleifen

+
+
+

4.1. Frage

+
+

Wie sieht die Syntax einer If-Abfrage aus?

+
+
+
Antwort
+
+
if (Bedingung) {
+  Anweisungen
+}
+
+
+
+
+

4.2. Frage

+
+

Wie sähe der Ausdruck x = x < 0 ? -x : x mit einer normalen If-Abfrage aus?

+
+
+
Antwort
+
+
if (x < 0) x = -x;
+
+
+
+
+

4.3. Frage

+
+

Schreiben sie eine If-Abfrage, die abhängig vom Monat in der Integer-Variablen month (Der Januar entspricht der 1) die Jahreszeit ausgibt. (3-5: Frühling, 6-8: Sommer, 9-11: Herbst, 12-2: Winter)

+
+
+
Antwort
+
+
if (month >= 3 && month <= 5) {
+  System.out.println("Frühling");
+} else if (month >= 6 && month <= 8) {
+  System.out.println("Sommer");
+} else if (month >= 9 && month <= 11) {
+  System.out.println("Herbst");
+} else {
+  System.out.println("Winter");
+}
+
+
+
+
+

4.4. Frage

+
+

Schreiben sie eine Switch-Verzweigung, die abhängig vom Monat in der Integer-Variablen month (Der Januar entspricht der 1) die Jahreszeit ausgibt. (3-5: Frühling, 6-8: Sommer, 9-11: Herbst, 12-2: Winter)

+
+
+
Antwort
+
+
switch(month) {
+  case 3: case 4: case 5:
+    System.out.println("Frühling");
+    break;
+  case 6: case 7: case 8:
+    System.out.println("Sommer");
+    break;
+  case 9: case 10: case 11:
+    System.out.println("Herbst");
+    break;
+  default:
+    System.out.println("Winter");
+}
+
+
+
+
+

4.5. Frage

+
+

Was sind die drei Teile des Kopfes einer For-Schleife?

+
+
+
Antwort
+
    +
  1. +

    Initialisierung

    +
  2. +
  3. +

    Fortsetzungsbedingung

    +
  4. +
  5. +

    Schrittanweisung

    +
  6. +
+
+
+
+

4.6. Frage

+
+

Ist die folgende Schleife syntaktisch korrekt? Falls ja, was wird auf der Konsole ausgegeben?

+
+
+
+
int i,j;
+for(i = 0, j = 0; i+j < 10; j++, i++) {
+  System.out.println(i + " " + j);
+}
+
+
+
+
Antwort
+

Ja, die Schleife ist korrekt. Die Ausgabe lautet wie folgt:

+
+
+
+
0 0
+1 1
+2 2
+3 3
+4 4
+
+
+
+
+

4.7. Frage

+
+

In Anlehnung an die letzte Frage: Können Sie mit einem einzigen Schleifenkopf eine Schleife schreiben, die die x- und y-Koordinaten aller Pixel eines Bildes mit 8x10 Pixeln durchläuft?

+
+
+
Antwort
+
+
int x,y;
+for(x = 0, y = 0; x < 8 && y < 10; x = (x + 1) % 8, y = x == 0 ? y + 1 : y) {
+  System.out.println(x + " " + y);
+}
+
+
+
+
+

4.8. Frage

+
+

Ist die folgende Variante der Schleife auf S. 108 auch korrekt?

+
+
+
+
int i;
+for(int i=0; i < 10; i++) {
+  machEtwas(i);
+}
+
+
+
+
Antwort
+

Nein, diese Schleife ist nicht korrekt. Die Variable i im Kopf der for-Schleife darf nicht namensgleich mit einer lokalen Variablen im außeren Umfeld der for-Schleife sein.

+
+
+
+

4.9. Frage

+
+

Ist for(int i; i < 10; i++) { …​ } korrekt?

+
+
+
Antwort
+

Der Code ist nicht korrekt. Die Variable i wird nicht initialisiert.

+
+
+
+

4.10. Frage

+
+

Was ist bei Schleifen zu beachten deren Zählvariable vom Typ float oder double ist?

+
+
+
Antwort
+

Die Fortsetzungsbedingung sollte kein exakter Vergleich sein, da dieser eventuell durch Rundungsfehler nie zutrifft.

+
+
+
+

4.11. Frage

+
+

Kann der Zähler einer for-Schleife auch den Typ char haben?

+
+
+
Antwort
+

Ja, da ein char immer auch einem Zahlwert entspricht (entsprechend der UTF-16-Kodierung).

+
+
+
+

4.12. Frage

+
+

Ein Student und eine Studentin schreiben den folgenden for-Kopf, um die Summe der Zahlen von 1 bis 50 zu berechnen: for(i = 1, sum = 0; i ⇐ 50; sum = i+); Was sagt Ihnen Ihr Programmierverstand?

+
+
+

(Übrigens: Der Kopf der Schleife ist syntaktisch korrekt, da liegt nicht das Problem!)

+
+
+
Antwort
+

Die Variable sum wird innerhalb der Schleife definiert, kann aber außerhalb der Schleife nicht mehr ausgelesen werden.

+
+
+
+

4.13. Frage

+
+

Schreiben Sie die folgende For-each-Schleife mit einer normalen for-Schleife: for(int x: ar) { System.out.println(x); }

+
+
+
Antwort
+
+
for(int i = 0; i < ar.length; i++) {
+  System.out.println(ar[i]);
+}
+
+
+
+
+

4.14. Frage

+
+

Was ist der Unterschied zwischen einer while-Schleife und einer do-while-Schleife? In welchem Fall ist die eine sinnvoller, in welchem die andere?

+
+
+
Antwort
+

Die do-while-Schleife wird immer mindestens einmal durchlaufen. Wenn man z.B. einen Verbindungsversuch über das Netzwerk im Fehlerfall wiederholen möchte, wäre eine do-while-Schleife passender, da der Verbindungsversuch ja auf jeden Fall mindestens einmal stattfinden sollte.

+
+
+
+

4.15. Frage

+
+

Man kann jede for-Schleife in eine while- bzw. do/while-Schleife umwandeln. Stimmt das?

+
+
+
Antwort
+

Ja.

+
+
+
+

4.16. Frage

+
+

Beschreiben Sie die Ausführung einer for-Schleife:

+
+
+

for(init ; cond ; change) { body ; } Welche Anteile werden in welcher Reihenfolge wiederholt ausgeführt?

+
+
+
Antwort
+
    +
  1. +

    init

    +
  2. +
  3. +

    falls cond, dann body

    +
  4. +
  5. +

    change

    +
  6. +
  7. +

    gehe zu 2.

    +
  8. +
+
+
+
+

4.17. Frage

+
+

Herrn Kofler kräuseln sich die Fußnägel, wenn Sie Fließkommazahlen im Kopf einer for-Schleife verwenden. Warum?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

4.18. Frage

+
+

for(int i = 0; i < 100; i++) { if (i % 2 == 0) System.out.println(i); }

+
+
+

Vervollständigen Sie den folgenden Code so, dass er das gleiche tut wie der oben stehende Code:

+
+
+
+
int i = 0;
+while(true) {
+ // hier bitte Code einfügen
+ System.out.println(i);
+ // hier bitte Code einfügen
+}
+
+
+
+

Sie dürfen bereits bestehende Zeilen nicht mehr ändern, nur welche hinzufügen.

+
+
+
Antwort
+
+
int i = 0;
+while(true) {
+ if(i >= 100) break;
+ if(i % 2 != 0) continue;
+ System.out.println(i);
+ i++;
+}
+
+
+
+
+

4.19. Frage

+
+

Der Kopf for(int i = 1; ; i++) sei gegeben, Sie dürfen ihn nicht verändern. Allerdings darf die Schleife nur für i bis 50 laufen. Retten Sie das im Rumpf!

+
+
+
Antwort
+
+
for(int i = 1; ; i++) {
+  if (i > 50) break;
+}
+
+
+
+
+
+
+

5. Arrays

+
+
+

5.1. Frage

+
+

Wie lauten die zwei Syntaxvarianten zur Deklaration einer (eindimensionalen) Array-Variable?

+
+
+
Antwort
+
+
datentyp[] var
+datentyp var[]
+
+
+
+
+

5.2. Frage

+
+

Kann die Größe von Java-Array nachträglich verändert werden? Warum/Warum nicht?

+
+
+
Antwort
+

Die Größe eines Arrays kann nicht nachträglich verändert werden. Arrays belegen einen zusammenhängenden Platz im Arbeitsspeicher, der Platz ist vorreserviert und kann nicht mehr angepasst werden.

+
+
+
+

5.3. Frage

+
+

Seite 121: "Arrays können auch in for-each-Schleifen durchlaufen werden. Die Array-Elemente können dann jedoch nur gelesen, nicht aber verändert werden."

+
+
+

Warum können die Elemente nicht verändert werden? Erläutern Sie.

+
+
+
Antwort
+

Die Elemente werden einzeln einer Variable zugewiesen (Ihnen fehlt z.B. auch der Index für einen Zugriff).

+
+
+
+

5.4. Frage

+
+

Seite 121: Was ist wohl mit "echten mehrdimensionalen Arrays" gemeint?

+
+
+
Antwort
+

Die Speicherorganisation ist nicht verschachtelt, sondern sequentiell.

+
+
+
+

5.5. Frage

+
+

Seite 122: Warum for(int j=0; j<x[i].length; j)` beim Durchlauf von zweidimensionalen Arrays? Warum nicht `for(int j=0; j<x[0].length; j)?

+
+
+
Antwort
+

Weil die einzelnen Zeilen des Arrays unterschiedliche Längen haben könnte.

+
+
+
+

5.6. Frage

+
+

Ist \u0000 wirklich das Zeichen 0? Deklarieren Sie in der JShell ein leeres char-Array und geben Sie den Inhalt aus.

+
+
+
Antwort
+
+
jshell> char[] ar = new char[1];
+ar ==> char[1] { ' ' }
+
+
+
+

Das ist kein "echtes" Leerzeichen (im Sinne der "Leertaste" auf Ihrer Tastatur), sondern das Unicode "Null"-Zeichen.

+
+
+
+

5.7. Frage

+
+

Welchen Typ hat ein Array, das auf der Konsole als [Ljava.lang.String;@ff5b51f ausgegeben wird?

+
+
+
Antwort
+
+
String[]
+
+
+
+
+

5.8. Frage

+
+

Wie könnte man eine "schönere" String-Darstellung des Arrays aus der letzten Aufgabe erhalten?

+
+
+
Antwort
+

Mit der Arrays.toString-Methode.

+
+
+
+

5.9. Frage

+
+

Was ist eine Shallow-Copy?

+
+
+
Antwort
+

Man kopiert das Arrays. Enthält das Arrays Referenzen, werden auch die Referenzen kopiert, nicht die referenzierten Elemente. Das heißt, die Referenzen werden zwischen dem ursprünglichen und der Kopie geteilt.

+
+
+
+

5.10. Frage

+
+

Worauf muss man beim Kopieren von mehrdimensionalen Arrays achten?

+
+
+
Antwort
+

Die clone-Methode (und auch andere Kopiermethoden der Java-API) erzeugen nur eine Shallow-Copy, bei der nur auf der obersten ebene Kopiert wird. Die einzelnen Teil-Arrays sind immer noch identisch (gleiche Referenz), so dass Änderungen an der Kopie sich auf das Original auswirken.

+
+
+
+

5.11. Frage

+
+

Was müsste man tun, um eine Deep-Copy eines Arrays zu erhalten?

+
+
+
Antwort
+

Man muss dann auch die referenzierten Instanzen kopieren und die Referenzen innerhalb dieser Instanzen etc.

+
+
+
+

5.12. Frage

+
+

Es gibt zwei Probleme mit dem folgenden Snippet. Welche? +Array.sort(new int[]{5,7,-1,3,2})

+
+
+
Antwort
+
    +
  • +

    Es fehlt das "s": Arrays

    +
  • +
  • +

    Das Array wird an der Stelle sortiert, aber man kommt an das Ergebnis nicht dran, weil man keine Referenz auf das Array mehr hat.

    +
  • +
+
+
+
+

5.13. Frage

+
+

Seite 126: Ändern Sie die Deklaration des Arrays so, dass der Code von Herrn Kofler auf die Nase fällt. Sie dürfen weder den Typ noch den Namen des Arrays verändern.

+
+
+
Antwort
+
+
int x[] = { };`
+
+
+
+

Wenn es kein Element im Array gibt, wird x[0] eine Ausnahme werfen!

+
+
+
+
+
+

6. Zeichenketten

+
+
+

6.1. Frage

+
+

Wir ist die Schreibweise für ein Einzelzeichen-Literal?

+
+
+
Antwort
+
+
'Buchstabe'
+'\uXXXX'    //Unicode-Escape
+'\n'        //Newline
+'\t'        //Tabulator
+
+
+
+
+

6.2. Frage

+
+

Bei Literalen für Einzelzeichen hat der Backslash \ eine Sonderfunktion: Welche? (Wie nennt man den "Backslash"? Er ist das sogenannte ___zeichen.)

+
+
+
Antwort
+

Der Backslash ist ein Escape-Zeichen (bzw. deutsch "Ausstiegszeichen"). +Er dient dazu Unicode-Symbole und Steuerzeichen zu definieren, die nicht auf der Tastatur zu finden sind.

+
+
+
+

6.3. Frage

+
+

Was bedeutet "Unicode"?

+
+
+
Antwort
+

"Unicode" ist eine Zeichentabelle, die einer Zahl ein Zeichen zuordnet.

+
+
+
+

6.4. Frage

+
+

Wie prüfen Sie, ob ein char c eine Ziffer oder ein Großbuchstabe ist?

+
+
+
Antwort
+

Mit der Methode Character.isDigit bzw. Character.isUpper.

+
+
+
+

6.5. Frage

+
+

Definieren Sie eine char-Variable, die das Unicode-Symbol "Airplane" (U+2708) enthält.

+
+
+
Antwort
+
+
char c = '\u2708';
+
+
+
+
+

6.6. Frage

+
+

Ich gebe Ihnen ein geheimnisvolles Einzelzeichen geheim. Ermitteln Sie, welches Einzelzeichen geheim vorangeht und welches ihm folgt.

+
+
+
Antwort
+

Mit (char) (geheim + 1) bzw. (char) (geheim - 1).

+
+
+
+

6.7. Frage

+
+

Was ergibt 'T' + 'H' + 'M'?

+
+
+
Antwort
+
+
233
+
+
+
+
+

6.8. Frage

+
+

Was ergibt "" + 'T' + 'H' + 'M'?

+
+
+
Antwort
+
+
"THM"
+
+
+
+
+

6.9. Frage

+
+

Was ergibt 'T' + 'H' + 'M' + ""?

+
+
+
Antwort
+
+
"233"
+
+
+
+

Erklärung: Der Operator + ist linksassoziativ. D.h. der Ausdruck wird wie folgt geklammert: (('T' + 'H') + 'M') + ""

+
+
+
+

6.10. Frage

+
+

Wie machen Sie aus "MNI" eine Folge von Einzelzeichen?

+
+
+
Antwort
+
+
"MNI".toCharArray()
+
+
+
+
+

6.11. Frage

+
+

Erstellen Sie die Zeichenkette "C:\Users\mni\oop\" (Windows-Stil) als Pfad-Angabe unter Java.

+
+
+
Antwort
+
+
String file = "C:\\Users\\mni\\oop\\";
+
+String file = "C:" + File.separtor + "Users" + File.separator + "mni" + File.separator + "oop" + File.separator
+
+
+
+
+

6.12. Frage

+
+

Beschreiben Sie den visuellen Effekt der Zeichenkette "\n\tTest\n".

+
+
+
Antwort
+
+
  Test
+
+
+
+

Erklärung: \n leitet einen Zeilenumbruch ein, \t steht für ein Tabulatorzeichen.

+
+
+
+

6.13. Frage

+
+

Initialisieren Sie String s als leere Zeichenkette!

+
+
+
Antwort
+
+
String s = "";
+
+
+
+

Hinweis: String s; bzw. String s = null; wäre keine korrekte Lösung, da eine leere Zeichenkette trotzdem ein vollwertiges String-Objekt ist.

+
+
+
+

6.14. Frage

+
+

Gegeben sei das Array String[] s. Wir möchten davon eine Kopie anlegen. Muss man eine deep copy anfordern, reicht eine shallow copy oder genügt gar eine einfache Zuweisung?

+
+
+
Antwort
+

Strings sind immutable (dt. unveränderlich). D.h. ein einmal erzeugtes String-Objekt kann sich nicht mehr verändern. Daher reicht es in diesem Fall eine shallow copy des Arrays zu machen.

+
+
+
+

6.15. Frage

+
+

Warum sollte man eine Zeichenkette niemals mit == vergleichen?

+
+
+
Antwort
+

Der Operator == überprüft bei komplexen Typen wie String nur, ob es sich um die selbe Referenz handelt (d.h. ob die Daten an der gleichen Stelle im Speicher stehen). Mit dem Inhalt des Strings hat das nichts zu tun.

+
+
+
+

6.16. Frage

+
+

Ergibt "abc" == "abc" immer true oder kann es vielleicht auch mal false ergeben?

+
+
+
Antwort
+

Dieser Vergleich ergibt immer true, da String-Literale vom Compiler so optimiert werden, dass zwei gleiche Literale auch die gleiche Referenz erhalten (Strings werden internalisiert).

+
+
+
+

6.17. Frage

+
+

Was liefert der Vergleich "aaa" > "abc"?

+
+
+
Antwort
+

Dieser Vergleich ist ein Syntaxfehler. Der Operator > ist nur für primitive Typen definiert. Zum Vergleichen von Strings braucht man die Methode compareTo.

+
+
+
+

6.18. Frage

+
+

Was ergibt String.valueOf("String")?

+
+
+
Antwort
+
+
"String"
+
+
+
+
+

6.19. Frage

+
+

Welchen Formatierungscode brauchen Sie, um eine Fließkommazahl mit drei Nachkommastellen darzustellen?

+
+
+
Antwort
+

%.3f

+
+
+
+

6.20. Frage

+
+

Alles happy? int i = 3; System.out.println(i.toString());

+
+
+
Antwort
+

Hier gibt es einen Fehler, weil i vom primitiven Typ int ist. Primitive Typen haben keine Methoden, auch kein toString.

+
+
+
+

6.21. Frage

+
+

Warum gibt es String.valueOf(), wenn es doch die toString()-Methode gibt?

+
+
+
Antwort
+

Weil toString() nicht auf primitive Datentypen angewendet werden kann.

+
+
+
+

6.22. Frage

+
+

Trennen Sie die Zeichenkette C:\Users\mni\oop\ mit der Methode split in die einzelnen Pfadbestandteile auf. Welches Problem ergibt sich dabei?

+
+
+
Antwort
+
+
String path = "C:\\Users\\mni\\oop\\";
+path.split("\\\\");
+
+
+
+

Die Methode split erwartet einen regulären Ausdruck. Der Backslash hat auch in regulären Ausdrücken eine besondere Bedeutung. Der String "\\" entspricht dem regulären Ausdruck \, der selbst keine Bedeutung hat (ein Escape-Zeichen ohne nachfolgendes Zeichen). Um den regulären Ausdruck \\ zu erhalten, der auf das Zeichen \ matcht, muss man also tatsächlich "\\\\" schreiben.

+
+
+
+

6.23. Frage

+
+

Geben Sie ein String-Format an, das die Zahl 12.345678f nur mit exakt zwei Nachkommastellen angibt. (edited)

+
+
+
Antwort
+

System.out.printf("%.2f", 12.345678f)

+
+
+
+

6.24. Frage

+
+

Gegeben sei float[] floats = { 1.234f, 12.56f, 123f }. Gehen Sie in einer Schleife durch das Array und geben Sie die Zahlen untereinander aus. Die Kommas sollen positionsgleich untereinander stehen, eine Nachkommastelle ist relevant. (edited)

+
+
+
Antwort
+
+
for(float f: floats) {
+  printf("%5.1f\n", f);
+}
+
+
+
+
+

6.25. Frage

+
+

Welcher Hex-Darstellung entspricht 2017?

+
+
+
Antwort
+
+
printf("%04X", 2017);
+
+
+
+
+

6.26. Frage

+
+

In einer String-Variable namens geheim steht ein Dateiname. Finden sie die Dateiendung heraus (der Teil nach dem letzten Punkt im Namen).

+
+
+
Antwort
+
+
String geheim = "test.hallo.txt";
+
+// Variante 1: split
+String[] split = geheim.split("\\.");
+System.out.println(split[split.length - 1]);
+
+//Variante 2: lastIndexOf
+System.out.println(geheim.substring(geheim.lastIndexOf(".")+1));
+
+
+
+
+

6.27. Frage

+
+

Sie treffen auf Aliens, die Ihnen auf eine Tafel die Zahl "110" schreiben. Sie stellen fest, dass die Aliens an ihren beiden Händen insgesamt 6 Finger haben. Wie lautet die Zahl also im 6er-System?

+
+
+

(Schon "Arrival" im Kino geschaut?)

+
+
+
Antwort
+
+
Integer.parseInt("110", 6);
+
+
+
+
+

6.28. Frage

+
+

Long.parseLong("55",5) — Autsch! Warum?

+
+
+
Antwort
+

Es gibt kein Zeichen 5 im 5er-System.

+
+
+
+

6.29. Frage

+
+

Long.parseLong("55L") — Autsch! Schade! Warum schade?

+
+
+
Antwort
+

Die Methode parseLong parst nur Zahlen, das L führt daher zu einem Fehler.

+
+
+
+

6.30. Frage

+
+

In welchen Fällen ist der Einsatz der Klasse StringBuilder sinnvoll?

+
+
+
Antwort
+

Wenn viele Teilstrings mit + konkateniert werden müssten. Der StringBuilder spart in diesem Fall viel Rechenzeit, da bei einer normalen Konkatenation der gesamte String kopiert werden muss.

+
+
+
+

6.31. Frage

+
+

Sie wollen sicherstellen, dass Java bei der Übersetzung Ihres Java-Programms die Java-Datei in der Kodierung UTF-8 einliest. Wie machen Sie das?

+
+
+
Antwort
+
+
javac -encoding UTF8 ...
+
+
+
+
+

6.32. Frage

+
+

StringBuilder s1 = new StringBuilder("Hallo "); StringBuilder s2 = new StringBuilder("Welt"); Wären s1 und s2 Strings, so könnten Sie beide mit s1+s2 konkatenieren. Wie lösen Sie das Problem vergleichbar hier?

+
+
+
Antwort
+
+
s1.append(s2.toString());
+
+
+
+
+

6.33. Frage

+
+

Das Programm auf Seite 147/148 zählt Groß- und Kleinbuchstaben in einem String. Wäre statt der if-Anweisungen nicht ein switch passender und würde den Code lesbarer machen?

+
+
+
Antwort
+

Das switch müsste jeden einzelnen Buchstaben als case definieren. Man kann keine dynamischen cases wie case c.isDigit() definieren.

+
+
+
+

6.34. Frage

+
+

Zeichensatzprobleme gibt es nicht nur in Quellcodedateien, sondern auch immer dann wenn Zeichenketten von außerhalb in das Programm kommen oder ausgegeben werden (z.B. über das Netzwerk oder aus einer Datei). Um zwischen verschiedenen Kodierungen wechseln zu können bietet die Klasse String den Konstruktor String(byte[], Charset) und die Methode getBytes(Charset).Wandeln Sie das Zeichen ä (unicode \u00e4) erst in US_ASCII um und lesen das resultierende Byte-Array wieder so ein als wäre es UTF_8-kodiert.

+
+
+
Antwort
+
+
import java.nio.charset.StandardCharsets;
+byte[] ascii = "\u00e4".getBytes(StandardCharsets.US_ASCII);
+new String(ascii, StandardCharsets.UTF_8).getBytes();
+
+
+
+
+
+
+

7. Datum und Uhrzeit

+
+ +
+
+
+

8. Methoden

+
+
+

8.1. Frage

+
+

Haben Klassen Methoden? Oder haben Objekte Methoden?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

8.2. Frage

+
+

In Java gibt es Klassen, die nur statische Methoden haben. Macht das Sinn? Nennen Sie ein Beispiel.

+
+
+
Antwort
+

Ja. So z.B. bietet die Klasse Math statische Methoden an. Wir brauchen keine Instanzen, da mathematische Funktionen zustandslos sind.

+
+
+
+

8.3. Frage

+
+

Wie sieht der syntaktische Aufbau des Kopfes einer Methode aus? Beginnen Sie beim Rückgabetyp.

+
+
+
Antwort
+
+
rückgabetyp methodName(typ1 parName1, typ2 parName2)
+
+
+
+
+

8.4. Frage

+
+

Jemand schreibt die Methode void Sort(String[] passwords) und bekommt sofort Schelte von seinen Kolleg(inn)en. Warum?

+
+
+
Antwort
+

Methodennamen niemals mit einem Großbuchstaben beginnen! Es sollte sort heißen.

+
+
+
+

8.5. Frage

+
+

Wenn Arrays.sort() ein bestehendes Array verändern kann, könnte man dann auch eine Methode void increment(int i) {…​} schreiben, die eine bestehende Integer-Variable verändert?

+
+
+
Antwort
+

Der Aufruf von increment(j) führt dazu, dass der Wert hier der Variablen j an i zugewiesen wird (Fachbegriff: pass by value). Damit können aber keine Änderungen am Wert von j bewirkt werden.

+
+
+
+

8.6. Frage

+
+

In jedem Java-Programm muss es genau eine main-Methode geben. Wie muss der Kopf der main-Methode aussehen?

+
+
+
Antwort
+

public static void main(String[] args)

+
+
+
+

8.7. Frage

+
+

static Car getCar() { return this.car; } Autsch! Warum?

+
+
+
Antwort
+

In einer statischen Methode darf niemals this genutzt werden.

+
+
+
+

8.8. Frage

+
+

In welchem Fall muss eine Methode in ihrem Rumpf eine return-Anweisung enthalten?

+
+
+
Antwort
+

Wenn der Rückgabetype void ist, kann, muss aber kein return (ohne Rückgabewert) im Rumpf vorkommen. Ansonsten muss immer mindestens ein return im Rumpf mit einem Rückgabewert vorkommen.

+
+
+
+

8.9. Frage

+
+

Die Methode String.valueOf muss mit sehr vielen verschiedenen Datentypen als Parameter umgehen. Wie kann es sein, dass man an die Methode sowohl einen double als auch einen char übergeben kann und trotzdem immer das richtige Ergebnis bekommt?

+
+
+
Antwort
+

Unter dem gleichen Namen, hier valueOf, gibt es verschiedene Methodenköpfe (und damit auch verschiedene Implementierungen) die jeweils verschiedene Typen im Kopf für den Parameter formulieren. (Fachbegriff: method dispatch nennt sich der Mechanismus, die richtige Methodenimplementierung herauszusuchen.)

+
+
+
+

8.10. Frage

+
+

float numberOne() { return 1.0; } Autsch oder nicht Autsch, das ist hier die Frage!

+
+
+
Antwort
+

Autsch, da 1.0f im `return``stehen muss.

+
+
+
+

8.11. Frage

+
+

Könnte man den Parameter args der Main-Methode auch als eine variable Anzahl von Strings definieren? Probieren Sie es aus!

+
+
+
Antwort
+

Ja, darf man! // Check TODO

+
+
+
+

8.12. Frage

+
+

Eine Methode sei mit einem Argument deklariert (keine Überladung), sie wird jedoch mit drei Argumenten aufgerufen — und Java akzeptiert das klaglos. Wie muss die Methode deklariert worden sein?

+
+
+
Antwort
+

Wieder ein …​ (Varargs).

+
+
+
+

8.13. Frage

+
+

Was ist der sogenannte CallStack?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

8.14. Frage

+
+

Ist die folgende Definition von überladenen Methoden zulässig?

+
+
+
+
float foo(int x) { return x; }
+float foo(int ... x) { return x[0]; }
+
+
+
+
Antwort
+

Der Aufruf scheint mehrdeutig zu sein. Bei dem Aufruf mit einem Argument wird die spezifischere Deklaration (die erste) ausgewählt.

+
+
+
+

8.15. Frage

+
+

Auf welche Weisen kann man eine Methode "überladen"?

+
+
+
Antwort
+

Durch die +* Anzahl und den +* Typ +der Parameter.

+
+
+
+

8.16. Frage

+
+

void doStuff(int …​ x, String y) { …​ } - Geht das?

+
+
+
Antwort
+

Varargs müssen immer am Ende deklariert sein.

+
+
+
+

8.17. Frage

+
+

Was ist der Grund, wenn der CallStack überläuft?

+
+
+
+

8.18. Frage

+
+
Antwort
+

Definieren Sie eine Methode floatEquals, die zwei float-Werte a und b und einen optionalen dritten float Wert tolerance übernimmt und einen boolean zurückgibt.

+
+
+
Antwort
+

Varargs sind keine Lösung, weil sonst auch mehr als drei Argumente möglich wären.

+
+
+
+
boolean floatEquals(float a, float b) { ... }
+boolean floatEquals(float a, float b, float tolerance) { ... }
+
+
+
+
+

8.19. Frage

+
+

Welche Informationen werden auf dem CallStack gespeichert?

+
+
+
+

8.20. Frage

+
+
Antwort
+

Wenn man einen Parameter mit final ausweist verhindert das …​ was?

+
+
+
Antwort
+

Man dem Wert des Parameters keinen neuen Wert zuweisen.

+
+
+
+

8.21. Frage

+
+
+
void foo() {
+  return;
+  System.out.println("returned");
+}
+
+
+
+

Geht das?

+
+
+
Antwort
+

Ein Methodenaufruf endet bei dem return, die nachfolgende Codezeile wird niemals ausgeführt und ist damit toter Code (dead code). Der Java-Compiler erkennt das und übersetzt deshalb den Code nicht, in der Annahme, dass das keine Absicht sein kann.

+
+
+
+

8.22. Frage

+
+
+
void bar() {
+  if (true) return;
+  System.out.println("returned");
+}
+
+
+
+

Und das?

+
+
+
Antwort
+

Der Code nach dem if wird vom Compiler nicht als toter Code erkannt, da er die Konsequenz von dem true nicht nachvollzieht.

+
+
+
+

8.23. Frage

+
+

return(0) statt return 0 ist in Java zulässig. Geht auch return() statt return für void-Methoden?

+
+
+
Antwort
+

Nein. Die Klammern im return sind möglich, weil man Ausdrücke grundsätzlich klammern kann. Ein () ist kein gültiger Ausdruck.

+
+
+
+

8.24. Frage

+
+

Läuft der Code?

+
+
+
+
void flopp(int n) {
+    if (true) return;
+}
+
+
+
+
Antwort
+

Ja, sie läuft.

+
+
+
+

8.25. Frage

+
+

Und dieser hier?

+
+
+
+
int flopp(int n) {
+    if (true) return 0;
+}
+
+
+
+
Antwort
+

Java meldet "missing return statement". Den Fall hatten wir oben schon. Java erwartet, dass es nach dem if (wenn die Bedingung nicht greift), weiter geht und dort auch ein return folgen muss.

+
+
+
+

8.26. Frage

+
+

Was passiert bei der Ausführung dieser Methode?

+
+
+
+
float baz(float x) {
+  try {
+    if (x < 0) return 0;
+    x *= 2;
+    return x;
+  } finally {
+    System.out.println("returned from call baz(" + x + ")");
+  }
+}
+
+
+
+
Antwort
+

Das finally wird immer ausgeführt, egal ob die Exception geworfen wurde oder nicht — sogar noch "nach" dem return. +.finally schlägt return

+
+
+
+
+

Mit finally ist es möglich, dass "nach" einem return noch Code ausgeführt wird!

+
+
+
+
+
+

8.27. Frage

+
+
+
int rek(int n) {
+  if(n == 0) return 0;
+  return 2 * rek(n - 2);
+}
+
+
+
+

Geht das gut?

+
+
+
Antwort
+

Für große n wird der CallStack vorzeitig erschöpft, so dass kein Ergebnis berechnet wird.

+
+
+
+

8.28. Frage

+
+

Bei der Rekursion unterscheidet man stets den Abbruch- und den Wiederholungsfall. Erklären Sie das am Beispiel der rekursiven Implementierung der Fakultätsfunktion.

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

8.29. Frage

+
+
+
int fib(int n) { return n < 2 ? n : fib(n-1) + fib(n-2); }
+
+
+
+

Listen Sie die Aufrufe der Methode fib nacheinander auf, die ausgelöst werden, wenn int x = fib(4); ausgeführt wird.

+
+
+
Antwort
+
+
fib(4) -> return fib(3) + ...
+                  +-> return fib(2) + ...
+                              +-> return fib(1) + ...
+                                           1    + fib(0)
+                                                    0
+
+
+
+
+

8.30. Frage

+
+
+
boolean isOdd(int n) {
+  return n >= 0 && (n == 0 || isOdd(n-2));
+}
+
+
+
+

Funktioniert das?

+
+
+
Antwort
+

Ja. Das Fazinierende ist, dass es kein if gibt. Die Fallunterscheidung kommt durch das && zustande, dass die rechte Seite nur auswertet, wenn die linke ein true ergibt.

+
+
+
+

8.31. Frage

+
+

Es gibt einen Klassiker zur sogenannten wechselseitigen Rekursion: Methode boolean isOdd(int n) ruft boolean isEven(int n) auf und umgekehrt. Dabei reduziert jede Methode den Zahlenwert um 1, bevor der Gegenpartner aufgerufen wird. Was ist der jeweilige Abbruchfall? Implementieren Sie diese Rekursion.

+
+
+
Antwort
+
+
boolean isOdd(int n) {
+    if (n == 0) return false;
+    return isEven(n-1);
+}
+
+boolean isEven(int n) {
+    if (n == 0) return true;
+    return isOdd(n-1);
+}
+
+
+
+
+

8.32. Frage

+
+
+
int foo(int n) {
+  if (n > 100) return n-10;
+  else return foo(foo(n+11));
+}
+
+
+
+

WTF? Ist das erlaubt?

+
+
+
Antwort
+

Verstehen Sie auf den ersten Blick, was der Code macht? Das ist die McCarthy-Funktion, die schwer zu durchblicken ist.

+
+
+
+
+
+

9. Exceptions

+
+
+

9.1. Frage

+
+

Wenn eine Exception geworfen wird, dann sieht sich Java zur Laufzeit außerstande …​?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.2. Frage

+
+

Kann javac, der Java-Compiler, eine Exception zu Ihrem Code werfen?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.3. Frage

+
+

Die Informationen, die zu einer Exception geführt haben, werden wie kommuniziert?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.4. Frage

+
+

Wie heißt die oberste Klasse in der Exception-Hierarchie?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.5. Frage

+
+

Was ist ein Stack Trace?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.6. Frage

+
+

Wenn eine Exception vom Typ Error geworfen wird, dann hat das was für Konsequenzen?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.7. Frage

+
+

Was unterscheidet Exceptions, die von RuntimeException erben von anderen Subklassen von Exception?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.8. Frage

+
+

Warum ist der Name RunTimeException für eine der Exception-Klassen ein wenig unsinnig? (edited)

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.9. Frage

+
+

In welchem Fall muss im Kopf einer Methode throws samt Angabe der möglichen Ausnahme(n) stehen?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.10. Frage

+
+

Wenn catch-Blöcke identischen Code haben, bietet sich eine Verkürzungsform an. Beschreiben Sie den syntaktischen Aufbau des "verkürzten" catch-Kopfes.

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.11. Frage

+
+

Die StackTrace eines StackOverflowError ist sehr lang. Warum?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.12. Frage

+
+

try { /* some code */ } and there is something wrong.

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.13. Frage

+
+

Was ist der Vorteil eines try-with-resources gegenüber einem normalen finally-Block?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.14. Frage

+
+

Anschlussfrage: Was ist eine resource?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.15. Frage

+
+

Ein Student schreibt folgende main-Methode und wird sofort dafür gescholten. Warum?

+
+
+
+
public static void main(String[] args) throws Throwable {
+  // ...
+}
+
+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.16. Frage

+
+

Was macht die assert-Anweisung?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.17. Frage

+
+
+
try {
+  // dangerous stuff
+} catch (Exception e) {
+  e.printStackTrace();
+} catch (NumberFormatException nfe) {
+  System.err.println("Stupid user input!")
+}
+
+
+
+

Geht das?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.18. Frage

+
+

Sie haben in Ihrem Code assert-Anweisungen, die eigentlich eine Exception auslösen müssten (Beispiel: assert false;). Die Exceptions bleiben aus. Was ist los?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

9.19. Frage

+
+

Kann man selbst Exceptions definieren?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+
+
+

10. Klassen

+
+
+ + + + + +
+ + +
+

Hinweis: Tabelle 10.1, Modifizierer, müssen Sie können.

+
+
+
+
+

Es kam die Frage auf, warum man in einer Klasse überhaupt Felder und Methoden nicht static machen soll. Hier ein Versuch, unsere Diskussion nachzuzeichnen.

+
+
+

Wir erstellen eine Klasse Car und geben ihr das statische Feld owner. Die Besitzerin heiße Lisa.

+
+
+
+
jshell> class Car { static String owner; }
+|  created class Car
+
+jshell> Car.owner = "Lisa"
+$13 ==> "Lisa"
+
+
+
+

Lisa hat zwei Autos. Also instanziieren wir zwei Autos. Jedes dieser Autos können wir nach dem Wert des Felds owner befragen.

+
+
+
+
jshell> Car car1 = new Car()
+car1 ==> Car@148080bb
+
+jshell> car1.owner
+$15 ==> "Lisa"
+
+jshell> Car car2 = new Car()
+car2 ==> Car@6e1ec318
+
+jshell> car2.owner
+$17 ==> "Lisa"
+
+
+
+

Nun verkauft mir Lisa eines der Autos — sie erklärt sich einverstanden, dass ich als neuer Eigentümer ihres zweiten Autos eingetragen werde.

+
+
+
+
jshell> car2.owner = "Dominikus"
+$18 ==> "Dominikus"
+
+
+
+

Weil owner eine statische Klassenvariable ist, habe ich Lisa nun auch ihr anderes Auto abgeluchst, dessen Eigentümer ich nun ebenfalls bin.

+
+
+
+
jshell> car2.owner = "Dominikus"
+$18 ==> "Dominikus"
+
+
+
+

Zauberei? Betrug? Mitnichten, es liegt an der statischen Klassenvariablen. Wäre owner keine statische Klassenvariable gewesen, dann hätte jedes Auto seinen eigenen Wert für einen Eigentümer speichern können — und Lisa hätte mir nicht unfreiwillig all ihre Autos abgetreten. Probieren Sie’s aus!

+
+
+

Was lernen wir? Ein statisches Feld enthält einen Wert, den die Klasse speichert und der für alle Instanzen der Klasse gleich ist. Ein "normales", nicht statisches Feld ist eine Variable, die jede Instanz für sich individuell angelegt bekommt. Und genau das möchte Objektorientierung: jeder Instanz eine eigene Umgebung für (nicht statische) Klassenvariablen mitgeben.

+
+
+

10.1. Frage

+
+

Herr Kofler nennt welche Vorteile, die Objektorientierung bietet?

+
+
+
+

10.2. Frage

+
+
Antwort
+

Wann ist eine Klasse keine top level-Klasse?

+
+
+
Antwort
+

Wenn sie innerhalb von geschweiften Klammern steht.

+
+
+
+

10.3. Frage

+
+
+
void foo() {
+ class StrangeThing {
+   boolean isStrange = true;
+ }
+ StrangeThing thing = new StrangeThing();
+ System.out.println(thing.isStrange);
+}
+
+
+
+

Geht das?

+
+
+
Antwort
+

Das geht. Es handelt sich hier um eine lokale Klassendefinition, die nur innerhalb der Methode foo verwendet werden kann.

+
+
+
+

10.4. Frage

+
+

Wie sieht schematisch die Syntax zur Klasse aus? [ohne Annotationen und Generics]

+
+
+
Antwort
+
+
[Modifizierer] class Name [extends KlassenName] [implements I1, I2, ...]
+
+
+
+
+

10.5. Frage

+
+

In einer .java-Datei können mehrere Klassen deklariert werden. Allerdings gilt eine Einschränkung, was den Namen der Datei angeht. Welche?

+
+
+
Antwort
+

Wenn eine der Klassen öffentlich (public) ist, muss der Name der Datei dem Namen dieser Klasse entsprechen.

+
+
+
+

10.6. Frage

+
+

Schreibe class test und schon ist der Kopf ab, bevor auch nur ein { folgt. Warum? [Gemeint ist Ihr Kopf, nicht der der Klassendeklaration :upside_down_face:!)

+
+
+
Antwort
+

Es sollte class Test heißen. Namen von Klassen werden großgeschrieben.

+
+
+
+

10.7. Frage

+
+

Eine top level-Klasse darf welche Sichtbarkeiten nicht haben?

+
+
+
Antwort
+

private und protected sind nicht erlaubt, da eine Toplevel-Klasse sich nicht im Kontext einer anderen Klasse befindet und diese Sichtbarkeiten somit keinen Sinn ergeben.

+
+
+
+

10.8. Frage

+
+

Gibt es in Java das Laufzeitkonstrukt der Klasse?

+
+
+
Antwort
+

Nicht direkt, man kann nur darauf zugreifen mittels reflection ( Objektname.getClass() bzw. Klassenname.class).

+
+
+
+

10.9. Frage

+
+

Gibt es in Java das Laufzeitkonstrukt des Objekts?

+
+
+
Antwort
+

Ja.

+
+
+
+

10.10. Frage

+
+
+
class Thing {
+ private class PartOfThing {
+   String name = "part";
+ }
+}
+
+
+
+

Geht das?

+
+
+
+

10.11. Frage

+
+

Auf welcher Ebene ist die Klasse class A {} sichtbar?

+
+
+
Antwort
+

Auf der Paketebene. Wenn kein Modifizierer vorhanden ist, ist die Klasse paketsicher.

+
+
+
+

10.12. Frage

+
+

Was ist eine Klassenvariable? Doch dasselbe wie ein statisches Feld, oder?

+
+
+
Antwort
+

Für Herrn Kofler sind "Klassenvariablen" einfach nur beliebige Felder, egal ob sie static sind oder nicht. Die Terminologie ist hier in der Literatur nicht eindeutig.

+
+
+
+

10.13. Frage

+
+

Klären Sie die Begriffe "Feld" und "Variable".

+
+
+
Antwort
+

"Felder" sind Variablen, die im Rumpf einer Klasse deklariert werden.

+
+
+
+

10.14. Frage

+
+
+
class Thing {
+ public String name;
+}
+
+
+
+

Kann man auf das Feld name von anderen Paketen aus zugreifen?

+
+
+
Antwort
+

Nein, da man auf die Klasse Thing nicht aus anderen Paketen zugreifen kann.

+
+
+
+

10.15. Frage

+
+

Im Rumpf einer Klasse können welche Sprachkonstrukte deklariert werden?

+
+
+
Antwort
+

Methoden, Felder, Klassen, Interfaces und Enums.

+
+
+
+

10.16. Frage

+
+
+
class Point {
+ private int x,y;
+ Point(int x, int y) { this.x = x; this.y = y; }
+ boolean equals(Point other) {
+   return this.x == other.x && this.y == other.y;
+ }
+}
+
+
+
+

Ist der Zugriff auf das private Feld other.x erlaubt?

+
+
+
Antwort
+

Ja, weil die Sichtbarkeit private sich auf allen Code innerhalb der Klasse bezieht. Es ist egal, welches Objekt auf das Feld zugreift, so lange der Zugriff aus irgendeiner Methode der Klasse Point erfolgt.

+
+
+
+

10.17. Frage

+
+

Was ist mit dem Begriff "paketsicher" gemeint?

+
+
+
Antwort
+

"Paketsicher" bezeichnet die default-Sichtbarkeit von Klassen und Feldern (wenn kein Sichtbarkeitsmodifizierer angegeben wurde). Auf "paketsichere" Klassen und Felder kann man innerhalb des Pakets zugreifen in dem sie deklariert wurden.

+
+
+
+

10.18. Frage

+
+

Mit welchem Modifizierer kann man die Voraussetzung für einen immutablen (unveränderlichen) Datentyp schaffen? Reicht die Verwendung dieses Modifizierers allein schon aus, um die Immutabilität zu garantieren?

+
+
+
Antwort
+

Wenn ein Datentyp (eine Klasse) immutabel sein soll, müssen alle ihre Felder final sein. Das reicht allerdings noch nicht aus. Zusätzlich müssen alle Felder selbst einen immutablen Datentyp haben, oder es muss sichergestellt werden, dass niemand sonst eine Referenz auf interne Daten der Klasse haben kann.

+
+
+
+

10.19. Frage

+
+

Nennen Sie die einzelnen Schritte, die bei einem Aufruf von new ausgeführt werden.

+
+
+
Antwort
+
    +
  • +

    Speicherplatz für die nicht-statischen Felder der Klasse wird zugeteilt.

    +
  • +
  • +

    Außerdem wird eine Refenz zu der Klasse angelegt, von der ein Objekt erzeugt werden soll (um z.B. den Code von Methoden nachschlagen zu können).

    +
  • +
  • +

    Die Felder werden mit 0, false oder null initialisiert.

    +
  • +
  • +

    Der Konstruktor wird aufgerufen.

    +
  • +
  • +

    Eine Referenz auf das erstellte Objekt wird zurückgegeben.

    +
  • +
+
+
+
+

10.20. Frage

+
+

Wie sieht das Schema zum Zugriff auf eine statische Variable bzw. zum Aufruf einer statischen Methode aus?

+
+
+
Antwort
+

Klassenname.variablenname bzw. Klassenname.methodenname.

+
+
+
+

10.21. Frage

+
+

Recherchieren Sie: In der OOP-Veranstaltung hatten wir ein Beispiel, in dem wir eine statische Klassenvariable genutzt haben. Worum ging es bei dem Beispiel? Welchen Zweck hatte die statische Klassenvariable?

+
+
+
Antwort
+

Es ging um eine Klasse Thing mit einer ID, die sich in einem statischen Feld merkt, welche IDs schon vergeben wurden.

+
+
+
+

10.22. Frage

+
+
+
class Point {
+ int x = 0, y = 0;
+ Point(int x, int y) { this.x = x; this.y = y; }
+}
+Point p = new Point();
+
+
+
+

Autsch! Warum?

+
+
+
Antwort
+

Der Default-Konstruktor existiert nur, wenn kein anderer Konstruktor definiert wurde. In diesem Fall gibt es den Konstruktor Point() also nicht.

+
+
+
+

10.23. Frage

+
+

Deklarieren Sie eine Klasse, von der keine Objekte erzeugt werden können.

+
+
+
Antwort
+

class Math { private Math() {} } oder abstract class Thing {}.

+
+
+
+

10.24. Frage

+
+

Ein Konstruktor ist mit einer Methodendeklaration sehr vergleichbar. Nur: Der Konstruktor hat zwar einen Namen, ihm scheint jedoch der Rückgabetyp zu fehlen. Warum?

+
+
+
Antwort
+

Der Rückgabetyp eines Konstruktors ist immer die Klasse in der er deklariert wurde.

+
+
+
+

10.25. Frage

+
+

Was sind die Defaultwerte für Felder (Klassenvariablen)? Was sind die Defaultwerte für lokale Variablen?

+
+
+
Antwort
+

Die Defaultwerte für Felder sind 0 und false für primitive Typen bzw. null für Referenztypen. Lokale Variablen haben keine Defaultwerte.

+
+
+
+

10.26. Frage

+
+

Warum kann man finalize nicht für Aufräumarbeiten verwenden?

+
+
+
Antwort
+

finalize wird aufgerufen, wenn der Garbage-Collector das Objekt löscht. Es ist nicht garantiert, wann oder ob das überhaupt geschieht.

+
+
+
+

10.27. Frage

+
+

Wie ruft man im Konstruktor einen anderen Konstruktor der gleichen Klasse auf? Warum sollte man das überhaupt tun wollen?

+
+
+
Antwort
+

this(Parameter);

+
+
+
+

10.28. Frage

+
+
+
class A {
+ int a,b;
+ A() {
+   a = 0;
+   this(0);
+ }
+ A(int x) {
+   a = 1;
+   b = x;
+ }
+}
+
+
+
+

Autsch! Warum?

+
+
+
Antwort
+

Vor dem Konstruktoraufruf this(0); darf kein anderer Ausdruck stehen.

+
+
+
+

10.29. Frage

+
+

Im Vorgriff auch das nächste Kapitel: Wie ruft man im Konstruktor den Konstruktor der Oberklasse auf?

+
+
+
Antwort
+

super(Parameter);

+
+
+
+

10.30. Frage

+
+

Was ist die Besonderheit des Interfaces AutoCloseable? Welche Methoden deklariert es?

+
+
+
Antwort
+

Das Interface deklariert nur die Methode close. Klassen, die das Interface AutoCloseable implementieren, können in einem try-with-resources verwendet werden.

+
+
+
+

10.31. Frage

+
+

Ist this eine Variable?

+
+
+
Antwort
+

Streng genommen nein (this ist ein Schlüsselwort), aber man kann es gedanklich wie eine Variable behandeln.

+
+
+
+

10.32. Frage

+
+

Ist es nicht das gleiche, ob eine Klasse jetzt ein public int x definiert oder ein private int x mit den Methoden int getX() und void setX(int x)? Wo liegt der Unterschied?

+
+
+
Antwort
+

Mit den Methoden hat man mehr Kontrolle darüber, was mit dem Feld geschieht (z.B. welche Werte bei einem setX zulässig sind, oder welche Variablen tatsächlich hinter einem getX steht).

+
+
+
+

10.33. Frage

+
+

Wozu benötigt man this?

+
+
+
Antwort
+

Um einen Konstruktor in einem anderen Konstruktor aufzurufen und um ein Feld von einer lokalen Variable mit gleichem Namen zu unterscheiden.

+
+
+
+

10.34. Frage

+
+

Wenn man sich in den Namensgebungen für Parameter und lokale Variablen diszipliniert, benötigt man dann überhaupt noch this?

+
+
+
Antwort
+

Ja, für den Aufruf eines Konstruktors oder wenn this zurückgegeben oder an eine andere Methode übergeben werden soll.

+
+
+
+

10.35. Frage

+
+

Wenn an den Konstruktor "falsche" Werte übergeben werden, empfiehlt es sich mit einer Exception darauf zu reagieren. Welche Exception sollte man wählen, sofern man nicht spezifischer sein kann/möchte?

+
+
+
Antwort
+

IllegalArgumentException

+
+
+
+

10.36. Frage

+
+

Wenn es einen Konstruktor gibt, muss es auch einen Destruktor geben, nicht wahr?! Hat Java einen Destruktor? Begründen Sie Ihre Antwort!

+
+
+
Antwort
+

Nein, es gibt nur die Methode finalize, die aufgerufen wird, wenn der Garbage-Collector das Objekt löscht. (Achtung: Es kann nicht garantiert werden ob und wann das geschieht.)

+
+
+
+

10.37. Frage

+
+

Eine Klasse, die eine close-Methode anbietet sollte die Schnittstelle AutoCloseable implementieren. Warum?

+
+
+
Antwort
+

Damit die Klasse mit einem try-with-resources verwendet werden kann.

+
+
+
+

10.38. Frage

+
+

Was ist mit "Settern" und "Gettern" gemeint?

+
+
+
Antwort
+

Getter und Setter sind Methoden die das Lesen bzw. Schreiben von internen Daten einer Klasse kontrollieren.

+
+
+
+

10.39. Frage

+
+

Was ist damit gemeint, wenn man von einer "Datenklasse" spricht?

+
+
+
Antwort
+

Eine "Datenklasse" tut nichts anderes als Werte zu speichern. Die Klasse hat dann nur Felder, Getter und Setter.

+
+
+
+

10.40. Frage

+
+

Wenn Sie Setter- und Getter-Methoden implementieren, dann sollten die Felder wie deklariert sein?

+
+
+
Antwort
+

private

+
+
+
+

10.41. Frage

+
+

Oft sieht man Setter wie public setName(Typ value) { name = value; }. Was könnte man daran kritisieren?

+
+
+
Antwort
+

Dieser Setter macht nicht viel Sinn, da er sich genau so verhält als wäre die Variable name öffentlich deklariert.

+
+
+
+

10.42. Frage

+
+

Aufgrund welchen Prinzips der Softwaretechnik werden Setter und Getter begründet?

+
+
+
Antwort
+

Es geht um das Geheimnisprinzip, das besagt, dass von außen niemand wissen soll, wie die Datenhaltung innerhalb eines Objekts implementiert ist.

+
+
+
+

10.43. Frage

+
+

Welcher softwaretechnische Nutzen steckt vor allem in den Setter-Methoden?

+
+
+
Antwort
+

Setter ermöglichen es, zu kontrollieren welche Werte für ein Feld erlaubt sind.

+
+
+
+

10.44. Frage

+
+

Warum ist der Begriff "Unterklasse" für eine innere Klasse problematisch?

+
+
+
Antwort
+

Der Begriff "Unterklasse" wird meist für die abgeleitete Klasse einer Oberklasse genutzt. Bitte eine innere Klasse nicht als Unterklasse bezeichnen.

+
+
+
+

10.45. Frage

+
+
+
class A {
+  int x;
+  class B {
+    int x;
+    int foo(int x) {
+       // zähle alle drei mit x benannten Variablen zusammen
+    }
+  }
+}
+
+
+
+

Welcher Code muss an der markierten Stelle stehen, um den Wert von allen drei Variablen zusammenzuzählen? Wie unterscheidet man sie voneinander?

+
+
+
Antwort
+

Wir streuen in die Lösung zum Verständnis ein paar Ausgaben ein.

+
+
+
+
class A {
+  int x;
+  class B {
+    int x;
+    int foo(int x) {
+      System.out.println(x);
+      System.out.println(this.x);
+      System.out.println(A.this.x);
+      System.out.println(B.this.x);
+      // System.out.println(x);
+      return x + this.x + A.this.x; // this.x oder B.this.x
+    }
+  }
+}
+
+
+
+
+
jshell> new A()
+$37 ==> A@335eadca
+
+jshell> $37.new B()
+$38 ==> A$B@eec5a4a
+
+jshell> $38.foo(3)
+$39 ==> 3
+
+
+
+

Eine top level-Klasse als static zu deklarieren ist sinnfrei, da die Klasse an nichts "hängt" und nur Teil eines Pakets ist.

+
+
+
+

10.46. Frage

+
+

this.name oder name.this, das ist hier die Frage!

+
+
+
Antwort
+

Beides ist gültig, je nach Kontext. Im zweiten Fall ist name jedoch ein Klassenname und sollte eigentlich — unserer Konvention der Großschreibung für Klassennamen folgend — als Name.this geschrieben werden.

+
+
+
+

10.47. Frage

+
+
+
AutoCloseable a = new AutoCloseable() {
+  public void close() { System.out.println("closed"); }
+}
+
+
+
+

Warum geht das, obwohl AutoCloseable a = new AutoCloseable(); einen Fehler produziert?

+
+
+
Antwort
+

Hier liegt eine anonyme Klasse vor, die nach ihrer Implementierung sofort instanziiert wird.

+
+
+
+

10.48. Frage

+
+

Kann eine anonyme Klasse einen Konstruktor haben? Warum, oder warum nicht?

+
+
+
Antwort
+

Wenn es keinen Namen für die Klasse gibt, sie ist ja anonym (= hat keinen Namen), kann man keinen Konstruktor deklarieren.

+
+
+
+

10.49. Frage

+
+
+
class A {
+    static int b;
+    class C {
+        static int d;
+    }
+}
+
+
+
+

Sie dürfen eine Sache streichen, damit der Code gültig wird.

+
+
+
Antwort
+

C ist eine lokale Klasse, sie darf keine statischen Members haben. Streiche static bei int d.

+
+
+
+

10.50. Frage

+
+

Erzeugen Sie eine anonyme Unterklasse von java.awt.Point, die die Methode toString so überschreibt, dass die String-Repräsentation jetzt einfach der mathematischen Schreibweise (x, y) entspricht. Wie können Sie beim Erzeugen des Objektes dieser Klasse die Koordinaten x und y übergeben?

+
+
+
Antwort
+
+
java.awt.Point p = new java.awt.Point() {
+    public String toString() {
+        return "(" + x + ", " + y + ")";
+    }
+}
+
+
+
+

Die anonyme Klasse ist eine Unterklasse von java.awt.Point.

+
+
+
+
jshell> java.awt.Point p = new java.awt.Point() {
+   ...>     public String toString() {
+   ...>         return "(" + x + ", " + y + ")";
+   ...>     }
+   ...> }
+p ==> (0, 0)
+
+jshell> p.x = 10
+$41 ==> 10
+
+jshell> p
+p ==> (10, 0)
+
+
+
+
+

10.51. Frage

+
+
+
Object obj = new Object() {
+  public void myFancyNewMethod() { /* do stuff */ }
+}
+
+
+
+

Macht das Sinn?

+
+
+
Antwort
+

Die Optik verstellt Ihnen hier vermutlich den Blick. new Object() ist eine anonyme Klasse, die eine Unterklasse von Object ist. Der Typ von obj ist hingegen vom Typ Object. Wenn man mit obj eine Methode wie myFancyNewMethod aufrufen will, beginnt die Suche nach der Methode im Typ Object, nicht in der anonymen Unterklasse! Die Methode ist also sinnfrei.

+
+
+
+

10.52. Frage

+
+

Eine Instanz einer anonyme Klasse kann nur auf bestimmte Variablen des Kontextes zugreifen, in dem sie erzeugt wurde. Welche Variablen sind das?

+
+
+
Antwort
+

Variablen müssen final sein.

+
+
+
+

10.53. Frage

+
+

Definieren Sie, was effectively final heißt?

+
+
+
Antwort
+

Eine Variable ist "effectively final", wenn sie zwar nicht als final deklariert ist, der Compiler aber eine Deklaration mit final zulassen würde.

+
+
+
+

10.54. Frage

+
+

AutoCloseable a = () → System.out.println("auto"); Wie nennt man so etwas?

+
+
+
Antwort
+

Das ist ein Lambda-Ausdruck, erkennbar am Pfeil .

+
+
+
+

10.55. Frage

+
+
+
String message = "foo";
+AutoCloseable a = new AutoCloseable() {
+  public void close() { System.out.println(message); }
+};
+message = "bar";
+
+
+
+

Alles in Butter, oder doch nicht?

+
+
+
Antwort
+

Das message nicht effectively final ist, darf die anonyme Klasse nicht auf message zugreifen.

+
+
+
+

10.56. Frage

+
+
+
class A {
+   static int b;
+   class C {
+       static int d;
+   }
+}
+
+
+
+

Sie dürfen eine Sache ergänzen, damit der Code gültig wird.

+
+
+
Antwort
+

Die Klasse C muss um ein static ergänzt werden.

+
+
+
+

10.57. Frage

+
+

Warum sind laut Herrn Kofler statische innere Klassen gar keine "inneren Klassen" im eigentlichen Sinne?

+
+
+
Antwort
+

Die "innere" Klasse ist wie eine eigenständige Klasse behandelbar.

+
+
+
+

10.58. Frage

+
+

Kann man eine Klasse mit dem qualifizierten Namen A.B.C definieren? Wenn ja, wie? (Die Punkte sind Teil des Namens.)

+
+
+
Antwort
+

Man kann es machen. In einer Klasse A ist eine Klasse B, in der sich eine Klasse C befindet.

+
+
+
+
+
+

11. Vererbung und Schnittstellen

+
+
+

Zu Beginn zwei Beispiele zur Polymorphie. Das Wort "Polymorphie" setzt sich aus zwei Teilen zusammen: poly für "viele" (sie kennen vielleicht das Wort "Polyphonie" als Mehrstimmigkeit) und morph für "Gestalt"; Polymorphie ist die Mehrgestaltigkeit. In der Objektorientierung ist damit gemeint, dass sich ein Objekt je nach Art der Gestalt (seinem Typ entsprechend) angepasst auf einen Methodenaufruf verhält.

+
+
+

Das Codebeispiel: Menschen (humans) sprechen anders als Tiere (animals). Im Beispiel ist eine Oberklasse nötig, um in einem Array sowohl Instanzen von Human wie auch von Animal aufnehmen zu können.

+
+
+
+
class Being {
+    String say(String text) {
+        return this.getClass().getName() + " says ";
+    }
+}
+
+class Human extends Being {
+    String say(String text) {
+        return super.say(text) + text;
+    }
+}
+
+class Animal extends Being {
+    String say(String text) {
+        return super.say(text) + "nothing (can't talk)";
+    }
+}
+
+Being[] beings = { new Human(), new Animal(), new Animal() };
+for(Being b : beings) System.out.println(b.say("good morning"));
+
+
+
+

Eine Alternative dazu definitert ein Interface namens Talker. Nun können die Klassen nicht auf eine gemeinsame Implementierung über die Oberklasse zugreifen; es besteht — was durchaus von Vorteil ist — auch gar keine Notwendigkeit mehr, eine Oberklasse einzuführen.

+
+
+
+
interface Talker {
+    String say(String text);
+}
+
+class Human implements Talker {
+    public String say(String text) {
+        return "Human says " + text;
+    }
+}
+
+class Animal implements Talker {
+    public String say(String text) {
+        return "Animal says nothing (can't talk)";
+    }
+}
+
+Talker[] talkers = { new Human(), new Animal(), new Animal() };
+for(Talker t : talkers) System.out.println(t.say("good morning"));
+
+
+
+

Im ersten Fall der Polymorphie ist den "vielen Gestalten" eine Oberklasse gemeinsam (sie definiert, was die Gestalt ist), im zweiten Fall ist den "vielen Gestalten" eine Schnittstelle gemeinsam (sie definiert, was die Gestalt kann), die jede teilhabende Klasse für sich implementiert.

+
+
+ + + + + +
+ + +
+

Hinweis zu Kap. 11.2: Sie müssen all die Methoden kennen, die Object hat und vererbt. Von notify, notifyAll und wait müssen Sie nur wissen, dass es sie gibt. Das Verständnis dazu erschließt sich erst, wenn wir uns mit Threads beschäftigen [nicht dieses Semester].

+
+
+
+
+ + + + + +
+ + +
+

Mehr zu Hashcodes können Sie z.B. nachlesen unter https://de.wikipedia.org/wiki/Hashfunktion. Hashcodes begegnen Ihnen im Informatik-Alltag immer wieder.

+
+
+
+
+ + + + + +
+ + +
+

Tabelle 11.1 (Schnittstellenübersicht) ist Gold wert! Lernen.

+
+
+
+
+

11.1. Frage

+
+

Wenn Sie class A extends B sehen, wissen Sie, dass B was an A vererbt?

+
+
+
Antwort
+

Nur wenn es etwas zu vererben gibt, Dinge die private sind werden nicht vererbt.

+
+
+
+

11.2. Frage

+
+

Wenn das hier geht Object getSelf() { return this; }, geht dann auch das Object getSelf() { return super; }?

+
+
+
Antwort
+

super wird nur verwendet zum Aufruf eines Konstruktors oder zum Zugriff auf Variablen und Methoden. super alleine verweist aber nicht auf eine Instanz.

+
+
+
+

11.3. Frage

+
+

Ordnen Sie (siehe letztes Beispiel) die Begriffe A oder B zu:

+
+
+
    +
  • +

    Oberklasse

    +
  • +
  • +

    Unterklasse

    +
  • +
  • +

    abgeleitete Klasse

    +
  • +
  • +

    Subklasse

    +
  • +
  • +

    generalisierende Klasse

    +
  • +
  • +

    spezialisierende Klasse

    +
  • +
  • +

    Basisklasse

    +
  • +
+
+
+
Antwort
+

A ist die Unterklasse, abgeleitete Klasse, Subklasse oder spezialisierende Klasse. B ist die Oberklasse, Basisklasse, (Superklasse) oder generalisierende Klasse.

+
+
+
+

11.4. Frage

+
+

Wann ist die Implementierung eines eigenen Konstruktors in einer abgeleiteten Klasse nicht optional?

+
+
+
Antwort
+

Beispiel:

+
+
+
+
class Super {
+  Super(int x) {
+    ...
+  }
+}
+class Sub extends Super {
+  Sub() {
+    // hier würde implizit super() aufgerufen
+    // dieser Konstruktor existiert aber nicht
+    // => es muss explizit super(int) aufgerufen
+    // werden
+  }
+}
+
+
+
+
+

11.5. Frage

+
+

Wenn man eine Methode überschreibt, dann ist die Verwendung einer Annotation üblich. Welcher?

+
+
+
Antwort
+

@Override

+
+
+
+

11.6. Frage

+
+

Eine Method überladen und sie überschreiben ist nicht dasselbe. Erkläre den Unterschied!

+
+
+
Antwort
+

Eine Methode überladen heißt, eine weitere Variante der Methode mit gleichem Namen aber unterschiedlicher Anzahl von Parametern oder unterschiedlichen Parametertypen zu deklarieren.

+
+
+

Eine Methode überschreiben heißt, in einer Unterklasse eine Methode mit gleicher Signatur (Name + Anzahl und Typ der Parameter) wie in der Oberklasse zu deklarieren.

+
+
+
+

11.7. Frage

+
+
+
class A { int method(int i) { return i+1; } }
+class B extends A { int method() { return 2; } }
+
+
+
+

Überschreibt B die Methode von A? Oder überlädt B die Methode?

+
+
+
Antwort
+

Das ist ein Beispiel für überladung, da die Methoden nicht die gleiche Anzahl von Parametern haben.

+
+
+
+

11.8. Frage

+
+

Mit welchem Schlüsselwort kann auf Members (Felder und Methoden) der Oberklasse zugegriffen werden?

+
+
+
Antwort
+

super

+
+
+
+

11.9. Frage

+
+

Wie Sie wissen, ist jede Klasse abgeleitet von Object. Wenn Sie Code wie class A { } sehen, welche Ergänzungen daran nimmt der Compiler vermutlich vor?

+
+
+
Antwort
+

class A extends Object { }

+
+
+
+

11.10. Frage

+
+

Kann eine abstrakte Klasse einen Konstruktor haben?

+
+
+
Antwort
+

Ja, sie können nur nicht mit new aufgerufen werden. In einer Subklasse können Sie aber mit super(…​) verwendet werden.

+
+
+
+

11.11. Frage

+
+

Wenn ich etwas super(…​) machen will, wohin damit?

+
+
+
Antwort
+

In die erste Zeile des Konstruktors der abgeleiteten Klasse.

+
+
+
+

11.12. Frage

+
+

Ich möchte gerne den Konstruktor der Ober-Oberklasse aufrufen. Wie geht das?

+
+
+
Antwort
+

Direkt geht das nicht, man kann nur auf die direkte Superklasse zugreifen und die muss dann wieder ihre Superklasse aufrufen.

+
+
+
+

11.13. Frage

+
+

Hans deklariert eine Klasse als final, Hannah als abstract. Was hat Hans mit der Klasse vor, was Hannah?

+
+
+
Antwort
+

Hans will, dass man von der Klasse nicht erben kann. Hannah will, dass man von der Klasse erben muss.

+
+
+
+

11.14. Frage

+
+

Hannah deklariert eine Methode als final, Hans als abstract. Woran muss Hans denken, was Hannah egal sein kann? Und was kann Hans sein lassen, was Hannah wiederum tun muss?

+
+
+
Antwort
+

Hans muss die Klasse als abstract deklarieren, Hannah muss im Gegensatz zu Hans die Methode implementieren.

+
+
+
+

11.15. Frage

+
+
+
class A { int x; }
+class B extends A { void foo() { x += 1; } }
+class C extends A { void foo() { x *= 2; } }
+A obj = new B();
+obj.foo();
+
+
+
+

Wie kann man diesen Code retten?

+
+
+
Antwort
+

Entweder man ändert die letzte Zeile auf ((B) obj).foo() und castet damit obj auf einen Typ der tatsächlich die Methode foo hat, oder man macht A abstrakt und deklariert die foo als abstrakte Methode in A.

+
+
+
+

11.16. Frage

+
+
+
class A {
+   void m() { System.out.println("mA"); }
+}
+
+class B extends A {
+   void m() { System.out.println("mB"); }
+}
+
+
+
+

Nun: A a = new B() bzw. B a = new B(). Was liefert in jedem der Fälle a.m() auf der Konsole?

+
+
+
Antwort
+

In beiden Fällen wird mB ausgegeben. Der Typ der Variablen entscheidet nicht darüber, welche Methode aufgerufen wird, sondern der Typ des Objektes das sich in der Variablen befindet.

+
+
+

Würde man die Methode m nicht in B implementieren, würde stattdessen (wegen der Vererbung) in beiden Fällen mA ausgegeben.

+
+
+
+

11.17. Frage

+
+
+
for (Object o : objects) {
+ String s = (String) o;
+ System.out.println(s);
+}
+
+
+
+

Ist das eine gute Idee? Warum?

+
+
+
Antwort
+

Das ist keine gute Idee, da man in den meisten Fällen einen spezifischeren Typ als Object verwenden kann und sollte. Außerdem ist der Downcast (String) o problematisch, da vorher nicht überprüft wurde ob es sich bei dem Inhalt der Object-Variable tatsächlich um einen String handelt.

+
+
+
+

11.18. Frage

+
+
+
Object o = "abc";
+int l = (String) o.length();
+
+
+
+

Ooops, was ist da schiefgegangen?

+
+
+
Antwort
+

Der Cast-Operator bindet schwächer als der .. Dieser Code versucht die Methode length von Object aufzurufen und das Ergebnis zum Typ String zu casten. Das scheitert aber, da die Klasse Object keine Methode length hat. Richtig müsste es heißen in l = ((String) o).length();

+
+
+
+

11.19. Frage

+
+

Ein …​cast passiert implizit, wenn ein Objekt einer Variable von einem Supertyp zugewiesen wird. Ein …​cast muss dagegen explizit angegeben werden.

+
+
+
Antwort
+
    +
  • +

    Up-

    +
  • +
  • +

    Down-

    +
  • +
+
+
+
+

11.20. Frage

+
+

Was bedeutet das Wort "Polymorphie" von seiner sprachlichen Herkunft?

+
+
+
Antwort
+

Polymorphie bedeutet "Vielgestaltigkeit". Eine Variable vom Typ List ist z.B. vielgestaltig, weil das tatsächliche Objekt sowohl eine ArrayList als auch eine LinkedList sein könnte.

+
+
+
+

11.21. Frage

+
+

Was gibt die Methode toString standardmäßig zurück?

+
+
+
Antwort
+

Klassenname@hashCode

+
+
+
+

11.22. Frage

+
+

Eine Klasse, die als class A {} deklariert wird, wird vom Compiler als class A extends Object {} aufgefasst. Wie ist das bei class A extends B {}? Ist eine Deklaration der Form class A extends B, Object {} oder class A extends B extends Object {} überhaupt erlaubt?

+
+
+
Antwort
+

Auch bei A extends B {} erbt A von Object. Allerdings geschieht das nicht direkt. Entweder hat B keine weitere Oberklasse und erbt damit von Object, oder die Vererbungskette geht noch einen oder mehrere Schritte weiter, bis die letzte Basisklasse erreicht ist, die dann von Object erbt.

+
+
+
+

11.23. Frage

+
+

Die Aussage ist nicht ganz korrekt: "`getClass` gibt die Klasse einer Instanz zurück." Berichtigen Sie den Satz.

+
+
+
Antwort
+

getClass gibt ein Instanz der Klasse Class zurück, die eine Beschreibung der Klasse enthält.

+
+
+
+

11.24. Frage

+
+
+
class Foo {
+  int x;
+  public boolean equals(Object other) {
+    if (other instanceof Foo) {
+      Foo f = (Foo) other;
+      return f.x == x;
+    }
+    return false;
+  }
+}
+
+
+
+

Diese Klasse hat laut der Spezifikation der Methode equals ein Problem. Welches ist das?

+
+
+
Antwort
+

Wenn a.equals(b) den Wert true ergibt, dann muss auch a.hashCode() == b.hashCode() gelten. Man müsste also noch die Methode hashCode überschreiben um diese Eigenschaft sicherzustellen.

+
+
+

Außerdem gehört zum typischen Schema einer equals-implementierung noch am Anfang eine Überprüfung ob other == this gilt. In dem Fall kann man sofort true zurückgeben.

+
+
+

Der Code funktioniert übrigens auch, wenn für other der Wert null übergeben wird, da null instanceof X immer false ergibt, egal welche Klasse man für X einsetzt.

+
+
+
+

11.25. Frage

+
+

Wie sieht schematisch die Syntax einer Schnittstellen-Deklaration aus? [vereinfachte Variante, so wie Schnittstellen meist verwendet werden]

+
+
+
Antwort
+

interface Name { typ name(parameter); …​ }

+
+
+

Die Benennung des Interfaces endet oft auf -able, um anzuzeigen, dass mit dem Interface irgendeine Fähigkeit bezeichnet wird.

+
+
+
+

11.26. Frage

+
+

Welche Methodenkörper wären für die Methode hashCode der Klasse java.awt.Point zulässig und sinnvoll?

+
+
+
    +
  • +

    return x + y;

    +
  • +
  • +

    return x;

    +
  • +
  • +

    return y;

    +
  • +
  • +

    return x ^ y;

    +
  • +
  • +

    return (""+x+y).hashCode();

    +
  • +
  • +

    return (x + "," + y).hashCode();

    +
  • +
  • +

    return 0;

    +
  • +
  • +

    return new Random().nextInt();

    +
  • +
+
+
+
Antwort
+

Der HashCode soll eine (möglichst) eindeutige Kennung eines Objektes darstellen.

+
+
+
    +
  • +

    return x + y; kann (1, 4) und (4, 1) nicht unterscheiden (weil + kommutativ ist).

    +
  • +
  • +

    return x; ignoriert die Variable y und ist daher nicht sinnvoll.

    +
  • +
  • +

    return y; ignoriert die Variable y und ist daher nicht sinnvoll.

    +
  • +
  • +

    return x ^ y; kann (1, 4) und (4, 1) nicht unterscheiden (weil ^ kommutativ ist).

    +
  • +
  • +

    return (""+x+y).hashCode(); scheitert für (1, 14) und (11, 4).

    +
  • +
  • +

    return (x + "," + y).hashCode(); wäre eine sinnvolle Variante.

    +
  • +
  • +

    return 0; gibt den gleichen HashCode für jedes Objekt. Das ist nicht sinnvoll.

    +
  • +
  • +

    return new Random().nextInt(); ist eindeutig, aber das selbe Objekt bekommt bei mehreren Aufrufen von HashCode unterschiedliche codes. Das ist weder zulässig noch sinnvoll.

    +
  • +
+
+
+

Zulässig sind prinzipiell alle HashCodes, bei denen sichergestellt ist dass gleiche Objekte (Vergleich mit equals ergibt true) auch den gleichen HashCode erhalten. Das ist bei allen dieser Beispiele bis auf return new Random().nextInt(); der Fall.

+
+
+
+

11.27. Frage

+
+

Was ist richtig?

+
+
+

[ ] interface One extends Two +[ ] interface One implements Two

+
+
+
Antwort
+

Die zweite Variante funktioniert nicht.

+
+
+

Wenn man von mehreren Interfaces erben kann, kann man die folgende Syntax verwenden:

+
+
+
+
interface A { void foo(); }
+interface B { void bar(); }
+interface C extends A, B { void baz(); }
+
+
+
+
+

11.28. Frage

+
+

Man kann mit Überladung keine zwei Methoden mit gleicher Signatur erstellen. Schließen Sie daraus, was der Begriff Signatur bedeutet.

+
+
+
Antwort
+

Die Signatur ergibt sich aus dem Namen, dem Typ und der Anzahl der Parameter.

+
+
+
+

11.29. Frage

+
+

Eine Schnittstellendeklaration mit genau einer abstrakten Methode heißen?

+
+
+
Antwort
+

Funktionale Schnittstelle

+
+
+
+

11.30. Frage

+
+

Wie können wir Java überprüfen lassen, ob eine Schnittstelle ein funktionales Interface ist?

+
+
+
Antwort
+

Mit der Annotation @FunctionalInterface.

+
+
+
+

11.31. Frage

+
+

Wie sieht schematisch die Syntax einer Methode in einer Schnittstelle aus, die mit einer Implementierung versehen ist?

+
+
+
Antwort
+

Die Methode muss das Schlüsselwort default haben.

+
+
+
+

11.32. Frage

+
+

Mit der Nutzung von implements im Kopf einer Klassendeklaration verpflichtet sich der Rumpf, was zu tun?

+
+
+
Antwort
+

Alle Methoden des Interfaces müssen implementiert werden.

+
+
+

Ein Sonderfall wäre eine abstrakte Klasse. Hier kann die Implementierung von Methoden auch an Unterklassen delegiert werden.

+
+
+
+

11.33. Frage

+
+

Welchen Nutzen haben Schnittstellen außer von einer Klasse eine Implementierungsverpflichtung einzufordern?

+
+
+
Antwort
+

Man kann Schnittstellen als Typ im Code verwenden.

+
+
+
+

11.34. Frage

+
+

Karl sagt: "Wozu Schnittstellen, ich kann auch alles mit abstrakten Klassen machen, was Schnittstellen können." Was antwortet ihm Carla darauf?

+
+
+
Antwort
+

Man kann mehrere Schnittstellen implementieren, aber nur eine abstrakte Klasse erweitern.

+
+
+
+

11.35. Frage

+
+

Carla sagt: "Seitdem es default-Implementierungen bei Schnittstellen gibt, sind abstrakte Klassen überflüssig geworden." Was antwortet Karl darauf?

+
+
+
Antwort
+

Abstrakte Klassen können im Gegensatz zu Schnittstellen auch Felder besitzen.

+
+
+
+

11.36. Frage

+
+
+
interface I { void foo(); }
+class A implements I { void foo() {} }
+
+
+
+

Autsch! Warum?

+
+
+
Antwort
+

Die Implementierung von foo müsste public sein, weil jede Methode eines Interfaces implizit public und abstract ist.

+
+
+
+

11.37. Frage

+
+
+
abstract class A { void foo(); }
+
+
+
+

Aua! Weshalb?

+
+
+
Antwort
+

foo muss als abstract definiert werden.

+
+
+
+

11.38. Frage

+
+

interface I { abstract void foo(); } Geht das? Macht das Sinn?

+
+
+
Antwort
+

Das geht, macht aber nicht viel Sinn, da foo sowieso abstract wäre, auch wenn man den Modifizierer nicht verwendet.

+
+
+
+

11.39. Frage

+
+

Die Frage ist angeregt durch den Code auf S.277 aus Kapitel 12.

+
+
+
+
Geometrie geos = new Geometrie();
+
+
+
+

Ist Geometrie eine Klasse oder ein Interface?

+
+
+
Antwort
+

Das new und die runden Klammern für den argumentlosen Aufruf des Konstruktors verraten Ihnen, dass Geometrie eine Klasse sein muss.

+
+
+
+

11.40. Frage

+
+

Die Frage ist angeregt durch den Code auf S.277 aus Kapitel 12.

+
+
+
+
Geometrie[] geos = new Geometrie[4];
+
+
+
+

Ist Geometrie eine Klasse oder ein Interface?

+
+
+
Antwort
+

Es wird hier ein Array mit Elementen vom Typ Geometrie angelegt, mehr nicht. Es bleibt nachwievor offen, ob der Typ eine Klasse oder ein Interface ist.

+
+
+
+
+
+

12. Generische Klassen und Methoden

+
+
+
Die Syntax zu Typparametern
+
+
TypeParameter:
+    {TypeParameterModifier} Identifier [TypeBound]
+
+TypeBound:
+    "extends" TypeVariable
+    "extends" ClassOrInterfaceType {AdditionalBound}
+
+AdditionalBound:
+    "&" InterfaceType
+
+
+
+

Eine Entscheidung:

+
+
+
    +
  1. +

    Wir nehmen aus dem Kapitel 12 das Unterkapitel 12.4 (Wildcards) raus.

    +
  2. +
  3. +

    Wir ignorieren ansonsten die Verwendung von extends bei der Angabe von Typparametern.

    +
  4. +
+
+
+

Wir glauben, dass für Sie als Erstsemester einfache Generics genügen mögen.

+
+
+

Notiz:

+
+
+
+
jshell> class MyClass<N extends Number> { N n = (N)(new Integer(8)); }
+|  Warning:
+|  unchecked cast
+|    required: N
+|    found:    java.lang.Integer
+|  class MyClass<N extends Number> { N n = (N)(new Integer(8)); }
+|                                             ^--------------^
+|  modified class MyClass
+
+jshell> new MyClass<Integer>().n
+$16 ==> 8
+
+jshell> new MyClass<Number>().n
+$17 ==> 8
+
+jshell> new MyClass<Long>().n
+|  java.lang.ClassCastException thrown: java.lang.Integer (in module: java.base) cannot be cast to java.lang.Long (in module: java.base)
+|        at (#18:1)
+
+
+
+

12.1. Frage

+
+

Eine Klasse Container soll im Konstruktor einen beliebigen Typ als Inhalt (content) aufnehmen können. Schreiben Sie den Code ohne Object zu verwenden.

+
+
+
Antwort
+
+
class Container<T> {
+  T content;
+  Container(T content) {
+    this.content = content;
+  }
+}
+
+
+
+
+
jshell> new Container<Integer>(3)
+$20 ==> Container@17579e0f
+
+
+
+
+

12.2. Frage

+
+

Aus unerfindlichen Gründen bietet die Java-API keine Tupel-Klasse an. Wie würde so eine Klasse aussehen, die zwei Variablen von beliebigem Typ enthalten kann?

+
+
+
Antwort
+
+
class Tupel<T,U> {
+  T car; // das ist ein historischer Name
+  U cdr; // das ist ein historischer Name
+  Tupel(T first, U second) {
+    car = first;
+    cdr = second;
+  }
+}
+
+
+
+
+

12.3. Frage

+
+

Legen Sie eine neue ArrayList an, die ausschließlich aus Ganzzahlen besteht.

+
+
+
Antwort
+
+
new ArrayList<Integer>();
+
+
+
+
+

12.4. Frage

+
+

Was ist ein Typparameter?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

12.5. Frage

+
+

Deklarieren und initialisieren Sie eine Variable a, die ausschließlich eine ArrayListe von boolschen Werten aufnehmen kann. Die Lösung muss so kurz wie möglich sein.

+
+
+
Antwort
+

Entweder Sie deklarieren a vom Typ ArrayList:

+
+
+
+
ArrayList<Boolean> a = new ArrayList<>();
+
+
+
+

Oder, was Sie oft sehen, Sie nehmen das List-Interface als Typ, der durch die ArrayList implementiert wird.

+
+
+
+
List<Integer> a = new ArrayList<>();
+
+
+
+
+

12.6. Frage

+
+

Wie lautet die Syntax für eine generische Methode?

+
+
+
Antwort
+
+
<T extends I> Rückgabetyp methodName(parameters) { ... }
+
+
+
+
+

12.7. Frage

+
+

Inwiefern hebelt die Definition <T> T giveMeWhatIWant() { …​ } das Typsystem von Java aus?

+
+
+
Antwort
+

Diese Methode muss eine Implementierung bieten, die für jeden Typ passen muss.

+
+
+
+

12.8. Frage

+
+

Wie sieht schematisch die Syntax einer generischen Klasse aus? Reduzieren Sie die Syntax auf das Notwendigste.

+
+
+
Antwort
+
+
class Name<TypParameter, ...> { ... }
+
+
+
+
+

12.9. Frage

+
+
+
class A<T> { void foo(T x) {} }
+A myA = new A();
+
+
+
+

Kann man das schreiben? Welcher Typ wird für den Typparameter T eingesetzt?

+
+
+
Antwort
+

Der allgemeinste Typ hier, der implizit eingesetzt wird, ist Object. Aber: Das ist kein guter Programmierstil.

+
+
+
+

12.10. Frage

+
+
+
class Foo<T> {
+  int getLength(T value) {
+    return value.length();
+  }
+}
+Foo<String> f = new Foo<>();
+f.getLength("abc");
+
+
+
+

Oh Schmerz! Weswegen?

+
+
+
Antwort
+

Man kann nicht davon ausgehen, dass value, dessen Typ über T frei gewählt werden kann, eine length-Method hat.

+
+
+
+

12.11. Frage

+
+

class Bar<Blubber> { Blubber x; } Problem?

+
+
+
Antwort
+

Nein, kein Problem. Es ist unüblich, lange Namen für Typparameter zu wählen. Per Konvention verwendet man nur einzelne Großbuchstaben.

+
+
+
+

12.12. Frage

+
+

Man kann eine Klasse als MyClass<T extends Number> deklarieren, ist auch MyClass<T implements AutoCloseable> erlaubt?

+
+
+
Antwort
+

Das implements ist in der Syntax nicht vorgesehen, ist nicht erlaubt.

+
+
+
+

12.13. Frage

+
+

class ICanHazGenerics<E extends Comparable> {} Und schon gibt’s was auf die Finger. Was ist der Grund?

+
+
+
Antwort
+

Man sollte den Typ für Comparable<???> angeben.

+
+
+
+

12.14. Frage

+
+

class A<T extends B> {} Kann man A<B> value = new A<B>(); schreiben? Gilt also B extends B?

+
+
+
Antwort
+

Die Klasse B als T kann das, was B kann, das meint <T extends B>.

+
+
+
+

12.15. Frage

+
+
+
List<? extends Number> lst = new ArrayList<>();
+lst.add(new Integer(8));
+
+
+
+

Die zweite Zeile produziert einen Fehler. Können Sie sich vorstellen, warum man einer List<? extends Number> keinen Integer hinzufügen kann?

+
+
+
Antwort
+

Man könnte mal einen Integer der Liste hinzufügen, mal einen Double. Der Compiler kann diese Entscheidung nicht auflösen.

+
+
+
+
+
+

13. Lambda-Ausdrücke

+
+ +
+
+
+

14. Collections

+
+
+ + + + + +
+ + +
+

Hinweis: Die forEach-Methode erwartet einen Lambda-Ausdruck. Das kommt noch.

+
+
+
+
+

14.1. Frage

+
+

Welche besondere Bedeutung hat das Interface Iterable in Java?

+
+
+
Antwort
+

Wenn eine Klasse Iterable implementiert, kann man sie in einer for-each-Schleife verwenden.

+
+
+
+

14.2. Frage

+
+

Sie wollen ArrayList verwenden und dürfen nicht vergessen, welches Paket zu importieren?

+
+
+
Antwort
+

java.util

+
+
+
+

14.3. Frage

+
+

Welche dieser Klassen implementiert das Interface Collection?

+
+
+
    +
  • +

    HashSet

    +
  • +
  • +

    LinkedList

    +
  • +
  • +

    Stack

    +
  • +
  • +

    TreeMap

    +
  • +
+
+
+
Antwort
+

TreeMap ist die einzige Klasse aus der Liste, die keine Collection ist (obwohl sie zum Collection Framework gehört).

+
+
+
+

14.4. Frage

+
+

Auf S.295 oben heißt es: "…​ bietet sich der Einsatz einer List-Klasse an." Ist List eine Klasse?

+
+
+
Antwort
+

Nein, List ist ein Interface.

+
+
+
+

14.5. Frage

+
+
+
Set<Integer> s = new HashSet<Integer>();
+for(int i = 0; i < 100; i++) {
+ int x = new Random().nextInt();
+ if (! s.contains(x)) s.add(x);
+}
+
+
+
+
Antwort
+

Das if (! s.contains(x)) kann man sich sparen, da ein Set sowieso jedes Element nur einmal enthalten kann.

+
+
+
+
Set<Integer> s = new HashSet<Integer>();
+for(int i = 0; i < 100; i++) {
+  s.add(new Random().nextInt());
+}
+
+
+
+
+

14.6. Frage

+
+

Was bedeutet First in - First out?

+
+
+
Antwort
+

Das Element, das zuerst hinzugefügt wurde wird als erstes wieder aus der Datenstruktur entfernt. Das ist z.B. bei einer Queue der fall.

+
+
+
+

14.7. Frage

+
+

Warum gibt es für eine Schnittstelle wie z.B. List mehrere Implementierungen wie z.B. ArrayList oder Stack? Woher soll ich wissen, welche Implementierung ich nutzen soll?

+
+
+
Antwort
+

Die Implementierungen haben verschiedene Laufzeiten für die Ausführung der einzelnen Methoden. Man kann damit also abhängig davon welche Methoden man am häufigsten braucht entscheiden welche Implementierung besser für das eigene Problem funktioniert.

+
+
+
+

14.8. Frage

+
+

Den Interfaces Set, List, Stack, Queue und Map liegen anschauliche Vorstellungen zugrunde. Zeichnen Sie für jedes Interface ein Bild, was die zugrunde liegende Abstraktion illustriert. [Das soll helfen, sich zu erinnern, was die Schnittstellen tun.]

+
+
+
Antwort
+
    +
  • +

    Set (Menge): Korb oder Kreis mit ungeordneten Elementen

    +
  • +
  • +

    List (Liste): Regenwurm mit aneinanderhängenden Segmenten

    +
  • +
  • +

    Stack (Stapel): Gefäß, in das man nur von oben Sachen hineinlegen oder entfernen kann (LIFO)

    +
  • +
  • +

    Queue (Puffer): Warteschlange, Einbahnstraße (FIFO)

    +
  • +
  • +

    Map (Abbildung): Telefonbuch, Wörterbuch

    +
  • +
+
+
+
+CollectionBilder +
+
+
+
+

14.9. Frage

+
+

Warum kann man bei einer Collection die Variante der for-Schleife nutzen, die sich foreach-Schleife nennt?

+
+
+
Antwort
+

Weil Collection das Interface Iterable erweitert.

+
+
+
+

14.10. Frage

+
+

Warum sollten Sie davon Abstand nehmen, `Collection`s selber zu implementieren?

+
+
+
Antwort
+

Weil die bestehenden Implementierungen sehr effizient und ausgeklügelt sind.

+
+
+
+

14.11. Frage

+
+

Warum ist es oft attraktiv, wenn möglich, eine Schnittstelle statt eine Klasse als Typ einer Variablen anzugeben?

+
+
+
Antwort
+

Wenn man eine Schnittstelle verwendet, erhöht man die Wiederverwendbarkeit des Codes und man hat die Möglichkeit, später noch die konkrete Implementierung zu wechseln.

+
+
+
+

14.12. Frage

+
+

Warum ist es bei Collections manchmal sinnvoller, eine Variable mit der implementierenden Klasse statt dem Interface zu deklarieren.

+
+
+
Antwort
+

Manchmal möchte man Methoden einer Klasse verwenden, die nicht im Interface angegeben sind. Außerdem gibt es Fälle in denen eben nur eine konkrete Implementierung sinn macht (z.B. der Stack beim UPN-Taschenrechner).

+
+
+
+

14.13. Frage

+
+
+
List<Integer> lst = ...;
+for(int i = 0; i < lst.size(); i++) {
+ if (lst.get(i) < 0) lst.remove(i);
+}
+
+
+
+

Ojemine! Aus welchem Grunde?

+
+
+
Antwort
+

Diese Implementierung überspringt elemente in der Liste. Besser ist es hier einen Iterator zu verwenden.

+
+
+
+

14.14. Frage

+
+

Herr Kofler benennt fünf statische Methoden der Klasse Collections, die nützlich sind — und oft gebraucht werden.

+
+
+
Antwort
+
    +
  • +

    min

    +
  • +
  • +

    max

    +
  • +
  • +

    fill

    +
  • +
  • +

    binarySearch

    +
  • +
  • +

    sort

    +
  • +
+
+
+
+

14.15. Frage

+
+

Dem Kopf der for-Schleife fehlt doch was, oder?

+
+
+

for(Iterator<Integer> it = s.iterator(); it.hasNext(); )

+
+
+

Kann so eine for-Schleife überhaupt funktionieren?

+
+
+
Antwort
+

Der Kopf besitzt keine Schrittanweisung. So eine Schleife kann man durchaus definieren. Dann muss man aber die Schrittanweisung selbst im Körper der Schleife realisieren (in diesem Beispiel durch den Aufruf von it.next()).

+
+
+

In so einem Fall ist eigentlich eine while-Schleife sinnvoller.

+
+
+
+

14.16. Frage

+
+

Listen Sie freisprachlich auf (jeweils ein Verb), welche Fähigkeiten eine Collection mit sich bringt.

+
+
+
Antwort
+
    +
  • +

    Größe ermitteln

    +
  • +
  • +

    Elemente hinzufügen

    +
  • +
  • +

    Elemente entfernen

    +
  • +
  • +

    Prüfen ob ein Element in der Collection enthalten ist

    +
  • +
+
+
+
+

14.17. Frage

+
+

Was ist der wesentliche Unterschied zwischen einer Liste (List) und einer Menge (Set)?

+
+
+
Antwort
+

Eine Liste kann mehrere gleiche Elemente enthalten. Außerdem hat sie eine definierte Ordnung.

+
+
+
+

14.18. Frage

+
+

Set definiert add mit dem Rückgabetyp boolean. Warum?

+
+
+
Antwort
+

Wenn das Element schon enthalten ist, fügt add das Element nicht hinzu. Um diesen Fall zu erkennen, wird false zurückgegeben und true sonst.

+
+
+
+

14.19. Frage

+
+

In welcher Klasse finden Sie eine Methode um Listen zu sortieren?

+
+
+
Antwort
+

java.util.Collections

+
+
+
+

14.20. Frage

+
+

Die Implementierung HashSet<T> erwartet, das der parametrisierte Typ zwei Methoden "sauber" implementiert hat? Welche sind das?

+
+
+
Antwort
+

equals und hashSet

+
+
+
+

14.21. Frage

+
+

Der Unterschied zwischen einem LinkedHashSet und einem HashSet ist?

+
+
+
Antwort
+

Das LinkedHashSet erhält die chronologische Reihenfolge.

+
+
+
+

14.22. Frage

+
+

Was ist ein TreeSet?

+
+
+
Antwort
+

Ein TreeSet sortiert seine Element intern.

+
+
+
+

14.23. Frage

+
+

Set<java.awt.Point> pset = new TreeSet<java.awt.Point>(); Schon verloren. Wie kommt’s?

+
+
+
Antwort
+

java.awt.Point implementiert das Interface Comparable nicht, das aber nötig ist damit TreeSet seine Elemente sortieren kann. Man müsste dem Konstruktor einen Comparator übergeben, um das Problem zu lösen.

+
+
+
+

14.24. Frage

+
+

Welchen Wert hat new ArrayList<Integer>(10).size()?

+
+
+
Antwort
+

0

+
+
+
+

14.25. Frage

+
+

Wann sollte man der LinkedList den Vorrang vor ArrayList geben?

+
+
+
Antwort
+

Wenn man sehr häufig Elemente an beliebiger Stelle einfügen oder löschen möchte.

+
+
+
+

14.26. Frage

+
+

Was heißt "FIFO", was "LIFO"? (Das sind zwei ganz beliebte Abkürzungen.)

+
+
+
Antwort
+
    +
  • +

    FIFO = First in - First out

    +
  • +
  • +

    LIFO = Last in - First out

    +
  • +
+
+
+
+

14.27. Frage

+
+

Wie sollte man am Besten eine Liste oder ein Set kopieren?

+
+
+
Antwort
+

Mit einem Copy-Konstruktor (d.h. ein Konstruktor, der eine Collection übernimmt und alle Elemente aus dieser Collection dem neu erstellten Objekt hinzufügt).

+
+
+
+

14.28. Frage

+
+

Wenn Sie über Schlüssel-Wert-Paare einer Map iterieren wollen (und beides brauchen), können Sie die Methode entrySet verwenden. Der Rückgabetyp dieser Methode ist Set<Map.Entry<K,V>>. Erklären Sie diesen Typ.

+
+
+
Antwort
+

Der Rückgabetyp ist ein Set, dessen Elemente den Typ Map.Entry<K,V> haben. Map.Entry ist ein inneres Interface des Interface Map. Das ist das gleiche Prinzip wie bei einer inneren Klasse. Map.Entry ist außerdem generisch, damit man den Typ des Schlüssels K und den Typ des Werts V angeben kann.

+
+
+
+

14.29. Frage

+
+

Ist Map.Entry als static deklariert oder nicht? Woran sieht man das?

+
+
+
Antwort
+

Da Entry ein Interface ist, macht es gar keinen Unterschied, ob es static ist oder nicht. Tatsächlich wird das Schlüsselwort static sogar implizit ergänzt. Das kann man auch sehen an dem Fehler, den der Compiler bei folgendem Konstrukt angibt:

+
+
+
+
class A {
+  int x;
+  interface B {
+    default void foo() {
+      System.out.println(x);
+    }
+  }
+}
+
+
+
+
+

14.30. Frage

+
+

Die Map-Schnittstelle gehört nicht zu den Collections. Was könnte der Grund dafür sein?

+
+
+
Antwort
+

Im Gegensatz zu einer normalen Collection handelt es sich bei den Elementen einer Map nicht um einzelne Werte, sondern um Schlüssel-Wert-Paare. Wenn Map das Interface Collection und damit auch Iterable implementieren würde, müsste man sich für eine Sicht bei der Iteration entscheiden: Nur Schlüssel, nur Werte oder Schlüssel-Wert-Paare. Die Java-Entwickler haben diese Entscheidung dem Benutzer überlassen mit den Methoden keySet, values und entrySet.

+
+
+
+

14.31. Frage

+
+

Die Map<K,V>-Schnittstelle hat zwei wichtige Methoden put und get. Was vermuten Sie, wie die Methodenköpfe zu den beiden Methoden aussehen?

+
+
+
Antwort
+

Vermuten würde man das folgende:

+
+
+
+
void put(K key, V value);
+V get(K key);
+
+
+
+

Die tatsächlichen Methodenköpfe sehen aber wie folgt aus:

+
+
+
+
V put(K key, V value);
+V get(Object key);
+
+
+
+

put gibt tatsächlich den alten Wert zurück, der unter dem Schlüssel gespeichert war oder null falls der Schlüssel noch nicht existierte.

+
+
+

get übernimmt seltsamerweise ein Object. Vermutlich ist das der Fall, da get über die equals-Methode definiert ist, die ebenfalls ein beliebiges Object akzeptiert. Eine sauberere Deklaration im Sinne der Typsicherheit wäre aber tatsächlich V get(K key); gewesen.

+
+
+

Tatsächlich gibt die Java-API den Grund an, dass man auch ein Objekt eines anderen Typs als des Schlüsseltyps verwenden kann um Elemente aus der Map zu identifizieren. Es muss nur gegeben sein, dass key.equals(k) für den zu findendenden Schlüssel k in der Map true ergibt. Eine sinnvolle Anwendung dieser Eigenschaft wäre z.B. wenn man ein Interface Point mit den Implementierungen CarthesianPoint und PolarPoint hat. In diesem Fall könnte ein CarthesianPoint mit equals mit einem CarthesianPoint vergleichbar sein. Dann könnte man eine Map vom Typ Map<CarthesianPoint,Integer> definieren, bei der man aber auch PolarPoint Objekte verwenden kann, um auf die in der Map enthaltenen Werte zugreifen kann.

+
+
+
+

14.32. Frage

+
+
+
class A { int x; A(int x) {this.x = x; } }
+Map<A, Integer> myMap = new HashMap<>();
+myMap.put(new A(1), 1);
+myMap.put(new A(1), 2);
+
+
+
+

Was ergibt myMap.size()?

+
+
+
Antwort
+

Das Ergebnis ist 2, da die Klasse A keine equals-Methode implementiert und damit die equals-Implementierung von Object verwendet. Die Implementierung von equals alleine reicht hier übrigens nicht aus, da eine HashMap überhaupt erst equals aufruft, wenn beide Objekte schon den gleichen hashCode haben. Genau genommen müssen Sie also für dieses Beispiel hashCode und equals überschreiben.

+
+
+

Der Code hat auch noch ein ganz anderes Problem, denn man kann nicht mehr auf die Schlüssel zugreifen, die in der Map gespeichert wurde, da man keine Referenz mehr auf den Schlüssel hat.

+
+
+
+

14.33. Frage

+
+

Zur Map<K,V>-Schnittstelle finden Sie boolean containsKey(Object key) deklariert. Komisch? Komisch! Was ist an der Deklaration überraschend?

+
+
+
Antwort
+

Ähnlich wie bei get ist der Parameter von containsKey vom Typ Object statt vom Schlüsseltyp K. (Siehe dazu die Diskussion der Frage zu Deklaration von get.)

+
+
+
+

14.34. Frage

+
+

Was unterscheidet eine HashMap von einer LinkedHashMap? Welche der beiden Implementierungen verwenden Sie im Regelfall?

+
+
+
Antwort
+

LinkedHashMap bietet eine Ordnung der Schlüssel-Wert-Paare, die man aber in den meisten Fällen nicht braucht. Daher verwendet man im Regelfall HashMap.

+
+
+
+

14.35. Frage

+
+

Welche Probleme ergeben sich, wenn die Schlüssel einer Map veränderliche Objekte sind?

+
+
+
Antwort
+

Das Verhalten der Map wird dadurch undefiniert. Es könnten sogar zwei Schlüssel in der Map existieren, bei denen der Vergleich mit equals den Wert true ergibt.

+
+
+
+

14.36. Frage

+
+

Wenn man über den Inhalt einer Map iterieren möchte gibt es drei Möglichkeiten an ein Objekt zu gelangen das Iterable implementiert. Diese Möglichkeiten entsprechen jeweils einer anderen Sicht auf den Inhalt der Map. Welche sind das?

+
+
+
Antwort
+

Alle Schlüssel mit keySet, alle Werte mit values oder alle Schlüssel-Wert-Paare mit entrySet;

+
+
+
+

14.37. Frage

+
+

Die Map-Methode put liefert einen Wert zurück. Weshalb ist Sie nicht einfach als void deklariert?

+
+
+
Antwort
+

Die Methode gibt den alten Wert zurück, der unter dem gegebenen Schlüssel gespeichert war (oder null falls der Key noch nicht existierte).

+
+
+
+

14.38. Frage

+
+

Angenommen, Sie haben eine Map namens book vom Typ HashMap<ISBN,Book>. Schreiben Sie den Kopf einer for-Schleife, die über alle ISBNs iteriert.

+
+
+
Antwort
+
+
for(ISBN isbn: book.keySet())
+
+
+
+
+
+
+

15. Dateien und Verzeichnisse

+
+
+

Tabelle 15.2, 15.3, 15.4 sind wieder ein Gold-Nuggets.

+
+
+

15.1. Frage

+
+

Handelt es sich bei java.io.IOException um eine geprüfte oder eine ungeprüfte Ausnahme? Weshalb?

+
+
+
Antwort
+

Etwas, was keine Runtime-Exception ("dumme Programmierfehler") und kein Error (schwerwiegender Fehler) ist. Checked Exceptions (geprüfte Ausnahmen) müssen gefangen werden oder explizit weitergereicht werden.

+
+
+

Eine IOException ist eine Ausnahme, deren Auftreten ausserhalb meiner Verantwortung liegt, deshalb auftreten kann und unbedingt behandelt werden muss.

+
+
+
+

15.2. Frage

+
+

Welches Konstrukt sollte man verwenden, um Ressourcen nach der Verwendung automatisch zu schließen?

+
+
+
Antwort
+

try-with-resource, try (…​) catch/finally.

+
+
+
+

15.3. Frage

+
+

Geben Sie zwei Beispiele an, warum die Arbeit mit dem Dateisystem zu Exceptions führen kann.

+
+
+
Antwort
+

Zum Beispiel:

+
+
+
    +
  • +

    Die Datei existiert nicht

    +
  • +
  • +

    Die Datei ist schreibgeschützt und kann nicht überschrieben werden

    +
  • +
+
+
+
+

15.4. Frage

+
+
+
try (BufferedReader br = Files.newBufferedReader("test.txt", StandardCharsets.UTF_8)) {
+  // ...
+}
+
+
+
+

Könnte ich nicht nach diesem Block noch einmal br.readLine() aufrufen wollen? Weshalb kann br direkt nach Ende der geschweiften Klammer geschlossen werden?

+
+
+
Antwort
+

Innerhalb des try-Blocks wird die Ressource angelegt und dann wieder geschlossen.

+
+
+
+

15.5. Frage

+
+

Welches gedankliche Modell liegt einer Ressource zugrunde, so dass man die Arbeit mit ihr per close-Methode abschliesst? (edited)

+
+
+
Antwort
+

In der Java-Welt haben Sie nur ein Abbild von Geräten, "Dingen" etc., die sich außerhalb der JVM befinden, wie die vom Betriebssystem Ihres Rechners verwalteten Dateien, Ausgabegeräte, Eingabegeräte usw. Dieses Abbild gleicht Java in entsprechenden Klasseninstanzen ab. Die Synchronisationspunkte gibt es nur gelegentlich mit dem Aufruf mancher Methoden. Mit close() wird die Verbindung zur Außenwelt aufgelöst, es findet kein Austausch oder Abgleich mit der vormals assoziierten Ressource mehr statt.

+
+
+
+

15.6. Frage

+
+

Wofür brauchen Sie die Methode System.getProperty? Nennen Sie Beispiele für Eigenschaften, die Sie mit dieser Methode auslesen können.

+
+
+
Antwort
+

Zum Beispiel user.dir, user.home.

+
+
+
+

15.7. Frage

+
+

Was liefert in der JShell jshell> System.getProperty("user.dir") zurück?

+
+
+
Antwort
+

Es ist das Verzeichnis, in dem die JShell gestartet wurde.

+
+
+
+

15.8. Frage

+
+

Sie bekommen einen geheimen Pfad geheim vom Typ Path. Prüfen Sie, ob es sich dabei um ein existierendes Verzeichnis handelt und erstellen Sie dann ein neues Path-Objekt, das auf die Datei test.jar im Unterverzeichnis lib dieses Verzeichnisses verweist.

+
+
+
Antwort
+
+
Path geheim = ... ;
+if(File.exists(geheim) && Files.isDirectory(geheim)) { /* ... */ }
+
+
+
+

kann man verkürzen auf

+
+
+
+
if(File.isDirectory(geheim)) { /* ... */ }
+
+
+
+
+
Path p = geheim.resolve("lib").resolve("test.jar");
+
+
+
+
+
Path p2 = geheim.resolve("lib/test.jar");
+
+
+
+

Der Separator / ist Linux-Schreibweise. Die Klasse Path ist "clever" implementiert und kann das jedoch unabhängig vom verwendeten Betriebssystem verstehen.

+
+
+
+

15.9. Frage

+
+

Was ist ein absoluter Pfad?

+
+
+
Antwort
+

Unter Windows beginnt der Pfad mit dem Laufwerksbuchstaben. Unter Linux beginnt er mit dem Slash /.

+
+
+
+

15.10. Frage

+
+

Unter Windows entspricht System.getProperty("user.dir") welcher Umgebungsvariablen (aubrufbar in der Kommandozeile)?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

15.11. Frage

+
+

Mit welchem Kommando in der Windows-Kommandozeile wechseln Sie das Verzeichnis? Wir schauen Sie sich den Inhalt eines Verzeichnisses an?

+
+
+
Antwort
+
    +
  • +

    cd für change directory unter Windows und Linux

    +
  • +
  • +

    dir für directory, ls für list unter Linux

    +
  • +
+
+
+
+

15.12. Frage

+
+

Sie haben wieder einen geheimen Pfad geheim, der auf eine Datei MyTest.java verweist. Sie wissen nicht, in welchem Verzeichnis sich die Datei befindet, aber sie wissen dass es dort auch eine Datei namens MyOtherTest.java gibt. Nennen Sie zwei Wege, wie sie einen Pfad zu dieser Datei erzeugen können.

+
+
+
Antwort
+

 — TODO — 

+
+
+
+

15.13. Frage

+
+

Was ist eine Datei?

+
+
+
Antwort
+

Auf einer Festplatte eine verteilte Ablage von Nullen und Einsen zusammen, die das Betriebssystem als logische Einheit organisiert. In Java findet sich davon dann eine objektorientierte Abbildung.

+
+
+
+

15.14. Frage

+
+

Was ist ein Verzeichnis?

+
+
+
Antwort
+

Eine logische Organisationstruktor für Dateien und teils (so unter Linux) von Ressourcen. In Java bekommen wir nur objektorientierte Abbildungen davon zu sehen.

+
+
+
+

15.15. Frage

+
+

Wie muss die Signatur der Methode Paths.get aussehen, wenn Sie beliebig viele Strings als Argumente akzeptiert?

+
+
+
Antwort
+

Das ist der Varargs-Parameter.

+
+
+

Wie kann Paths.get eigentlich erzwingen, dass mindestens ein Argument übergeben werden muss? Der erste Parameter ist "normal", der zweite ein Varargs-Parameter.

+
+
+
+
Path get(String first, String... more)
+
+
+
+
+

15.16. Frage

+
+

Was ist ein Link?

+
+
+
Antwort
+

Gemeint ist der Verweis auf ein anderes Verzeichnis oder eine andere Datei,

+
+
+
+

15.17. Frage

+
+

Wie kopiert und wie verschiebt man eine Datei unter Windows von der Konsole aus?

+
+
+
Antwort
+
    +
  • +

    copy unter Windows, cp unter Linux/Powershell

    +
  • +
  • +

    move unter Windows, mv unter Linux/Powershell

    +
  • +
+
+
+
+

15.18. Frage

+
+

Welche Methode der Klasse Files liefert einen Stream - newDirectoryStream oder list?

+
+
+
Antwort
+

list ist ein Stream, newDirectoryStream eben nicht.

+
+
+
+

15.19. Frage

+
+

Schreiben Sie ein Programmfragment, das eine Textdatei zeilenweise einliest.

+
+
+
Antwort
+

Im nachfolgenden Code ist inFileName vom Typ String.

+
+
+
+
BufferedReader inFile = new BufferedReader(new FileReader(inFileName));
+while((line = inFile.readLine()) != null) {
+  // ...
+}
+inFile.close();
+
+
+
+

Diese Kurzlösung gibt kein Kodierungsformat für die einzulesende Textdatei an. Das kann in manchen Fällen wichtig und notwendig sein.

+
+
+
+

15.20. Frage

+
+

Schreiben Sie ein Programmfragment, das die Einträge eines String-Arrays als einzelne Zeilen in eine Textdatei schreibt.

+
+
+
Antwort
+

Im nachfolgenden Code ist outFileName vom Typ String und lines vom Typ String[].

+
+
+
+
BufferedWriter outFile = new BufferedWriter(new FileWriter(outFile1Name));
+for(String line : lines) {
+    outFile.write(line);
+    outFile.newLine();
+}
+outFile.close();
+
+
+
+
+

15.21. Frage

+
+

Muss man immer Files.createFile zum Anlegen einer neuen Datei verwenden, oder geht das auch einfacher?

+
+
+
Antwort
+

Wenn man eine Datei zum Schreiben öffnet, wird sie angelegt, wenn sie nicht existiert.

+
+
+
+

15.22. Frage

+
+

Was bedeuten die Zahlen in UTF-8, UTF-16 und UTF-32

+
+
+
Antwort
+

Die Zahlen geben an, mit wievielen Bits das Unicode-Zeichen per default kodiert ist. Aber: ein UTF-8 (ein Byte) oder UTF-16 (zwei Bytes) bezieht gegebenenfalls nachfolgende Bytes ein, um andere UTF-32-Zeichen darzustellen.

+
+
+
+

15.23. Frage

+
+

Muss man immer Files.createDirectory bzw. Files.createDirectories aufrufen um ein neues Verzeichnis zu erstellen, oder geht das auch einfacher?

+
+
+
Antwort
+

 — TODO — 

+
+
+
+
+
+

16. JavaFX

+
+ +
+
+
+

17. Javadoc

+
+ +
+
+
+

18. Pakete und Bibliotheken

+
+
+

18.1. Frage

+
+

Ist es möglich, umfangreiche Java-Programme ohne eine einzige import-Anweisung zu schreiben?

+
+
+
Antwort
+

Ja, Imports sind immer optional, da man auch den voll qualifizierten Namen von Referenztypen verwenden kann.

+
+
+
+

18.2. Frage

+
+
+
import java.util.Arrays.sort;
+int[] a = {4,1,3};
+sort(a);
+
+
+
+

Fügen Sie ein Schlüsselwort an der richtigen Stelle ein, damit der Code funktioniert.

+
+
+
+

18.3. Frage

+
+

Eine import-Anweisung muss immer wo stehen?

+
+
+
Antwort
+

Ganz am Anfang der Quellcodedatei (aber unter der package-Deklaration).

+
+
+
+

18.4. Frage

+
+

In den Fragen zu vorherigen Kapiteln haben wir immer java.awt.Point als Typ verwendet statt Point. Weshalb haben wir das gemacht und was muss man tun, um einfach direkt Point schreiben zu können?

+
+
+
Antwort
+

Wir haben java.awt.Point nicht importiert (um eine Zeile zu sparen), deshalb mussten wir den voll qualifizierten Klassennamen angeben. Wenn man den import import java.awt.Point; schreibt, kann man danach auch einfach Point schreiben.

+
+
+
+

18.5. Frage

+
+

Was kann man mit import importieren?

+
+
+
Antwort
+

Klassen, Interfaces, Enums

+
+
+
+

18.6. Frage

+
+

Was kann man mit import static importieren?

+
+
+
Antwort
+

Methoden, Felder und die Werte von Enums

+
+
+
+

18.7. Frage

+
+

Warum ist import ein irreführender Name? Tatsächlich organisiert man über import nur ___räume!

+
+
+
Antwort
+

Es geht um Namensräume.

+
+
+
+

18.8. Frage

+
+
+
import java.awt.Point;
+class Point { int x,y,z; }
+Point p = new Point();
+
+
+
+

Problem?

+
+
+
Antwort
+

Point ist an dieser Stelle mehrdeutig, da es eine lokale Klasse und eine importierte Klasse gibt.

+
+
+
+

18.9. Frage

+
+
+
import java.awt.*;
+Point p;
+
+
+
+

Geht das gut?

+
+
+
Antwort
+

Ja, da Point in dem Paket java.awt definiert ist und der * alle Klassen (und Interfaces und Enums) in dem Paket importiert.

+
+
+

Hinweis: Der importiert *keine Klassen die in Unterpaketen des angegebenen Pakets liegen, also z.B. in java.awt.color.

+
+
+
+

18.10. Frage

+
+

Was ist der Unterschied von import de.thm.mni; und import de.thm.mni.*;?

+
+
+
Antwort
+

Im ersten Fall soll eine Klasse namens mni aus dem Paket de.thm importiert werden, der zweite Ausdruck importiert alle Klassen in de.thm.mni.

+
+
+
+

18.11. Frage

+
+

Welches Paket ist standardmäßig in Java SE importiert?

+
+
+
Antwort
+

java.lang

+
+
+
+

18.12. Frage

+
+

import static java.awt.Color.* Jetzt darf ich Color c = new Color(0,0,0); deklarieren, richtig?

+
+
+
Antwort
+

Nein, weil der Import nur alle öffentlichen Member der Klasse Color importiert, nicht aber die Klasse selbst.

+
+
+
+

18.13. Frage

+
+

Wozu braucht man auf S.372 oben am Anfang die Codezeile import java.awt.Color; wenn unten darunter import static java.awt.Color.*; steht?

+
+
+
Antwort
+

Der erste import importiert die Klasse Color. Der zweite import ist static und importiert die statischen Members von Color.

+
+
+
+

18.14. Frage

+
+

Was muss man tun, damit man die Methoden der Klasse Math direkt ohne den Anteil Math. in seinem Code verwenden kann?

+
+
+
Antwort
+

import static java.lang.Math.*;

+
+
+
+

18.15. Frage

+
+

Kann ich die Klasse java.awt.Color und eine Klasse de.thm.mni.Color zusammen im gleichen Stück Code verwenden?

+
+
+
Antwort
+

Ja, man darf aber nur eine dieser Klassen importieren. Die andere muss man über den voll qualifizierten Namen ansprechen.

+
+
+
+

18.16. Frage

+
+

Man kann import static java.lang.System.out; schreiben. Dann geht doch auch import static java.lang.System.out.println;, oder?

+
+
+
Antwort
+

Nein, das geht nicht, weil out ein Objekt ist. Man kann keine Methoden aus einem Objekt importieren.

+
+
+
+

18.17. Frage

+
+

Was ist der Unterschied von import de.thm.mni.OOP; zu import static de.thm.mni.OOP;

+
+
+
Antwort
+

Der erste import importiert die Klasse OOP aus dem Paket de.thm.mni. Der zweite importiert etwas mit Namen OOP aus der Klasse mni im Paket de.thm.

+
+
+
+

18.18. Frage

+
+

Sie schreiben ein Programm im Fachbereich MNI der THM im Kurs OOP. Sie definieren ein Paket für Ihr Programm. Wie sollte der Paketname anfangen?

+
+
+
Antwort
+

de.thm.mni.oop

+
+
+
+

18.19. Frage

+
+

Die Option -cp bei java bzw. javac steht für welches Java-Konzept?

+
+
+
Antwort
+

Diese Option steht für den Classpath, in dem die JVM nach .class-Files sucht.

+
+
+
+

18.20. Frage

+
+

Welche Argumente müssen sie an java übergeben, wenn sie eine eigene Klasse main.Main ausführen wollen, die das Paket somePackage.jar verwendet? In welchen Ordnern sucht die JVM dabei nach der .class-Datei von main.Main und der Datei somePackage.jar?

+
+
+
Antwort
+

java -cp somePackage.jar:. main.Main

+
+
+

Die JVM sucht nach main.Main sowohl als ./main/Main.class als auch als somePackage.jar!main/Main.class (das ! steht dafür, dass das JAR-Archiv geöffnet und betreten wird). Die Datei somePackage.jar wird dabei im current working directory gesucht, in dem man sich auf der Konsole gerade befindet.

+
+
+

Wenn somePackage.jar in einem Unterordner libs liegen würde, müsste der Aufruf wie folgt aussehen: java -cp libs/somePackage.jar:. main.Main.

+
+
+

Herr Kofler macht zusätzlich Anführungszeichen um den Ausdruck hinter -cp. Das ist immer möglich aber nur dann nötig, wenn sich im übergebenen Klassenpfad ein Leerzeichen befindet.

+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/JavaFragen.html b/JavaFragen.html new file mode 100644 index 0000000..a106f40 --- /dev/null +++ b/JavaFragen.html @@ -0,0 +1,4088 @@ + + + + + + + + +Lernfragen zu Java + + + + + + +
+
+

Hinweis

+
+
+

Dieser Fragenkatalog enthält zahlreiche Fragen und Antworten zu dem Java-Programmierbuch von Michael Kofler, Java: Der Grundkurs, Rheinwerk, 2015. Die Kapitelordnung dieses Fragenkatalogs orientiert sich an den Kapiteln des Buchs von Michael Kofler, so dass Sie einen einfachen Bezug zwischen dem Buch und den Fragen herstellen können.

+
+
+

Der Fragenkatalog ist das Ergebnis der Projektwoche, die wir vom 2.-6. Januar 2017 mit den Studierenden der Veranstaltung "Objektorientierte Programmierung" (Erstsemester Informatik) an der Technischen Hochschule Mittelhessen (THM) durchgeführt haben. Wir haben in der Projektwoche den gesamten bisher gelernten Java-Stoff aus dem Wintersemester 2016/17 wiederholt. Als Grundlage zur Wiederholung diente das Java-Buch von Michael Kofler.

+
+
+

Wir möchten diesen Fragenkatalog allen Programmierinteressierten zur Verfügung stellen. Die Fragen sollen Ihnen beim Reflektieren des Gelesenen und beim Festigen Ihres Java-Wissens helfen.

+
+
+

Während der Projektwoche haben wir das Buch von Michael Kofler gemeinsam mit den Studierenden gelesen, dabei live die Fragen erstellt und anschließend die Antworten besprochen und dokumentiert. Manch eine Frage und manch eine Antwort muss überarbeitet werden, sicher ist uns manch ein Fehler unterlaufen. Helfen Sie uns dabei, den Fragenkatalog zu verbessern!

+
+
+

Dominikus Herzberg, @denkspuren

+
+
+
+

1. Hello World!: Java-Crashkurs [Kap. 1.8]

+
+
+

1.1. Frage

+
+

String x = "abc"; Wo ist das new zur Instanziierung?

+
+
+
+

1.2. Frage

+
+

Wie unterscheidet sich ein Javadoc-Kommentar von normalen Kommentaren?

+
+
+
+

1.3. Frage

+
+

Was ist ein Schlüsselwort?

+
+
+
+

1.4. Frage

+
+

Never use Dollars in Javaland. Why?

+
+
+
+

1.5. Frage

+
+

for(int i=0; i⇐10; i++);. Wo ist das Problem?

+
+
+
+

1.6. Frage

+
+

Das ; (Semikolon) beendet eine _?

+
+
+
+

1.7. Frage

+
+

Das + bei Strings ist ein _-Operator

+
+
+
+

1.8. Frage

+
+

Wenn jede Anweisung mit einem Semikolon beendet werden muss, gilt das auch für if oder while?

+
+
+

Bsp.: if (x < 0); x = 0; (Was macht dieser Code?)

+
+
+
+

1.9. Frage

+
+

Warum kann man die Klasse Math verwenden, ohne sie vorher zu importieren?

+
+
+
+

1.10. Frage

+
+

Wann kommt ein Punkt . vor den Klassennamen?

+
+
+
+

1.11. Frage

+
+

Auf S.54 steht was zur Option -encoding. In welchem Aufgabenblatt gibt es dazu eine Anmerkung?

+
+
+
+

1.12. Frage

+
+

Auf S.52 unten heißt es: "Java kennt keine Eigenschaften." Auf S.57 unten jedoch: "Über Attribute können Eigenschaften von Objekten gelesen bzw. gespeichert werden." Was ist da los? Ein Widerspruch?

+
+
+
+

1.13. Frage

+
+

import paket.; Was meint der Stern in der import-Anweisung?

+
+
+
+

1.14. Frage

+
+

S.59 im Code: DateTimeFormatter.ofPattern( "EEEE, d. MMMM yyyy" ); Häh?

+
+
+
+

1.15. Frage

+
+

Warum kann man keine Instanz der Klasse Math erzeugen?

+
+
+
+

1.16. Frage

+
+

Warum muss man überhaupt import verwenden?

+
+
+
+
+
+

2. Variablenverwaltung

+
+
+

2.1. Frage

+
+

Was heißt final als Teil einer Variablendefinition genau?

+
+
+
+

2.2. Frage

+
+

System.out. println(" Umfang: " + umfang);

+
+
+

Hier kommt ein Ausdruck der Form String + double vor. Welchen Effekt hat dieser Ausdruck?

+
+
+
+

2.3. Frage

+
+

Code auf S.63 oben: Wenn ich das in der JShell eingebe, gibt es gar keine Probleme. Irrt Herr Kofler, dass es da ein Problem geben kann?

+
+
+
+

2.4. Frage

+
+

Seite 63: Was ist damit gemeint, dass ein float eine Fließkommazahl mit "8 Stellen" darstellt? Geben Sie Beispiele für Zahlen, die nicht darstellbar sind.

+
+
+
+

2.5. Frage

+
+

Unter welchem Namen findet man die Konstanten +Infinity und -Infinity in der Java-API?

+
+
+
+

2.6. Frage

+
+

Warum sind Rundungsfehler bei Fließkommazahlen nicht zu vermeiden?

+
+
+
+

2.7. Frage

+
+

Rundungsfehler machen auch einen exakten Vergleich von zwei Fließkommazahlen schwierig. Wie kann man sicher überprüfen, ob eine Variable vom Typ float oder double "gleich null" ist? Gibt es eine Lösung, die für alle denkbaren Szenarien funktioniert?

+
+
+
+

2.8. Frage

+
+

Wie sieht schematisch die Syntax zur Deklaration einer Variablen aus?

+
+
+
+

2.9. Frage

+
+

Warum ist das Erzeugen von Zufallszahlen in Java nicht mit statischen Methoden realisiert? Warum muss man ein Objekt der Klasse Random erzeugen?

+
+
+
+

2.10. Frage

+
+

Welchen Wert haben die Variablen x, y und z nach der folgenden Definition: int x, y, z = 1;?

+
+
+
+

2.11. Frage

+
+

Was ist "implizites Casting"? Geben Sie ein Beispiel.

+
+
+
+

2.12. Frage

+
+

Was ist mit dem Begriff "Überlauf" gemeint?

+
+
+
+

2.13. Frage

+
+

Warum kann man einen int implizit zu long casten, einen long aber nicht zu int?

+
+
+
+

2.14. Frage

+
+

Wie sieht die Syntax für einen expliziten Cast (Typumwandlung) aus?

+
+
+
+

2.15. Frage

+
+

Was versteht man unter einem "Modifizierer" bei der Variablendefinition? Geben Sie ein Beispiel an.

+
+
+
+

2.16. Frage

+
+

Welchen Datentyp und welchen dezimalen Wert haben die folgenden Literale?

+
+
+
    +
  • +

    10

    +
  • +
  • +

    10.0

    +
  • +
  • +

    010

    +
  • +
  • +

    0x10

    +
  • +
  • +

    0b10

    +
  • +
+
+
+
+

2.17. Frage

+
+

Wie kann man den Wert "eine Million" mit drei Zeichen als Java-Literal darstellen?

+
+
+
+

2.18. Frage

+
+

Welche Ausgabe produziert das folgende Programmstück:

+
+
+
+
int x = 10;
+{
+  System.out.println(x);
+  int x = 5;
+  System.out.println(x);
+  {
+    System.out.println(x);
+  }
+}
+
+
+
+
+

2.19. Frage

+
+

Im Anschluss an obigen Code: Was ergibt { int x; int x; }?

+
+
+
+

2.20. Frage

+
+

Ist es eine gute Idee, die drei Punkte eines Dreiecks mit dem folgenden Code zu initialisieren? Warum?

+
+
+
+
java.awt.Point p1, p2, p3;
+p1 = p2 = p3 = new java.awt.Point(0, 0);
+
+
+
+
+

2.21. Frage

+
+

Wie könnte einer dieser ominösen auf S.77 erwähnten "Copy-Konstruktoren" für die Klasse java.awt.Point aussehen?

+
+
+
+

2.22. Frage

+
+

Was sind boxing und unboxing bei Wrapper-Klassen?

+
+
+
+

2.23. Frage

+
+

Was passiert bei der Ausführung von folgendem Code:

+
+
+
+
Double x = null;
+double y = x;
+
+
+
+
+

2.24. Frage

+
+

Warum kann man sowohl int x = Integer.parseInt("123"); als auch Integer x = Integer.parseInt("123"); schreiben? Was ist der Unterschied?

+
+
+
+

2.25. Frage

+
+

Was passiert bei folgender Deklaration Double x = 10;? Warum?

+
+
+
+

2.26. Frage

+
+

Gibt es einen Unterschied zwischen den folgenden beiden Codestücken?

+
+
+
+
int x = 10;
+double y = x;
+
+
+
+
+
Integer x = 10;
+Double y = x;
+
+
+
+
+

2.27. Frage

+
+

Ist Integer eine Sub- oder Superklasse von Long, oder keins von beidem?

+
+
+
+

2.28. Frage

+
+

Welche einzelnen Schritte müssen passieren, um eine Zahl von der Konsole einzulesen?

+
+
+
+

2.29. Frage

+
+

Woher weiß System.out.println in dem folgenden Beispiel, wie ein Punkt auf der Konsole aussehen soll?

+
+
+
+
System.out.println(new java.awt.Point(0,0));
+
+
+
+
+

2.30. Frage

+
+

Definieren Sie einen Enumerationstyp Ternary, der die drei Werte TRUE, FALSE, und MAYBE besitzt.

+
+
+
+

2.31. Frage

+
+

Können Enumerationstypen auch Methoden haben? Wie sieht die Deklaration eines solchen Typs aus?

+
+
+
+
+
+

3. Operatoren

+
+
+

3.1. Frage

+
+

Operatoren kommen nur vor in __?

+
+
+
+

3.2. Frage

+
+

Was ist mit der Priorität eines Operators gemeint? Geben Sie ein Beispiel an.

+
+
+
+

3.3. Frage

+
+

Der Minus-Operator “-” ist linksassoziativ. Was ist damit gemeint? Erklären Sie das an einem Beispiel.

+
+
+
+

3.4. Frage

+
+

Was ist der Unterschied zwischen & und &&?

+
+
+
+

3.5. Frage

+
+

Die Zuweisung ist ein Operator. Das heißt, die Zuweisung hat als Ergebnis einen _?

+
+
+
+

3.6. Frage

+
+

Anschluss an vorherige Frage: Ist der Zuweisungsoperator rechts- oder linksassoziativ? Können Sie einen Grund angeben, warum es so sein muss?

+
+
+
+

3.7. Frage

+
+

Es gibt drei(!) Kontexte im Zusammenhang von Ausdrücken, in denen runde Klammernpaare (…​) vorkommen. Welche sind das?

+
+
+
+

3.8. Frage

+
+

Erklären Sie, wie die Kopfzeile im while funktioniert:

+
+
+

whileline = breader.readLine( != null) { …​ }

+
+
+
+

3.9. Frage

+
+

Angenommen, es gäbe den Modulo-Operator % in Java nicht. Wie müsste dann eine Implementierung mod(int x, int y) z.B. in der Math-Klasse aussehen?

+
+
+
+

3.10. Frage

+
+

Die Kurzform x += 3 bedeutet ausführlich was?

+
+
+
+

3.11. Frage

+
+

Erläutern Sie den Unterschied von int a = n;` zu `int a = n;!

+
+
+
+

3.12. Frage

+
+

Die Vergleichoperatoren wie >, , == usw. stehen für welche Typen zur Verfügung?

+
+
+
+

3.13. Frage

+
+

Wann kann man die Methode compareTo verwenden?

+
+
+
+

3.14. Frage

+
+

Warum ist es keine gute Idee, zwei Zeichenketten mit == zu vergleichen?

+
+
+
+

3.15. Frage

+
+

Was ist der Unterschied von & und && bei boolschen Werten? In beiden Fällen ergibt sich immer das gleiche Ergebnis, z.B.:

+
+
+
+
jshell> true && false
+$11 ==> false
+jshell> true & false
+$12 ==> false
+
+
+
+
+

3.16. Frage

+
+

Wandeln Sie ein if (expr1 && expr2) {…​} so um, dass Sie nur if-Anweisungen ohne den &&-Operator verwenden!

+
+
+
+

3.17. Frage

+
+

Gleiche Aufgabe: Umwandlung von if (expr1 || expr2) { …​ }.

+
+
+
+

3.18. Frage

+
+

Multiplizieren Sie eine int-Zahl mit 4 ohne die Multiplikation zu verwenden.

+
+
+
+

3.19. Frage

+
+

Warum ist der ternäre-Operator nicht mit einem if zu vergleichen? Was ist anders?

+
+
+
+

3.20. Frage

+
+

Implementieren Sie eine Methode odd(int n) (odd heißt "ungerade"), die mithilfe eines Bitoperators ermittelt, ob der übergebene Integer ungerade ist oder nicht.

+
+
+
+

3.21. Frage

+
+

return b == true ? false : true; Verkürzen Sie die return-Anweisung.

+
+
+
+
+
+

4. Verzweigungen und Schleifen

+
+
+

4.1. Frage

+
+

Wie sieht die Syntax einer If-Abfrage aus?

+
+
+
+

4.2. Frage

+
+

Wie sähe der Ausdruck x = x < 0 ? -x : x mit einer normalen If-Abfrage aus?

+
+
+
+

4.3. Frage

+
+

Schreiben sie eine If-Abfrage, die abhängig vom Monat in der Integer-Variablen month (Der Januar entspricht der 1) die Jahreszeit ausgibt. (3-5: Frühling, 6-8: Sommer, 9-11: Herbst, 12-2: Winter)

+
+
+
+

4.4. Frage

+
+

Schreiben sie eine Switch-Verzweigung, die abhängig vom Monat in der Integer-Variablen month (Der Januar entspricht der 1) die Jahreszeit ausgibt. (3-5: Frühling, 6-8: Sommer, 9-11: Herbst, 12-2: Winter)

+
+
+
+

4.5. Frage

+
+

Was sind die drei Teile des Kopfes einer For-Schleife?

+
+
+
+

4.6. Frage

+
+

Ist die folgende Schleife syntaktisch korrekt? Falls ja, was wird auf der Konsole ausgegeben?

+
+
+
+
int i,j;
+for(i = 0, j = 0; i+j < 10; j++, i++) {
+  System.out.println(i + " " + j);
+}
+
+
+
+
+

4.7. Frage

+
+

In Anlehnung an die letzte Frage: Können Sie mit einem einzigen Schleifenkopf eine Schleife schreiben, die die x- und y-Koordinaten aller Pixel eines Bildes mit 8x10 Pixeln durchläuft?

+
+
+
+

4.8. Frage

+
+

Ist die folgende Variante der Schleife auf S. 108 auch korrekt?

+
+
+
+
int i;
+for(int i=0; i < 10; i++) {
+  machEtwas(i);
+}
+
+
+
+
+

4.9. Frage

+
+

Ist for(int i; i < 10; i++) { …​ } korrekt?

+
+
+
+

4.10. Frage

+
+

Was ist bei Schleifen zu beachten deren Zählvariable vom Typ float oder double ist?

+
+
+
+

4.11. Frage

+
+

Kann der Zähler einer for-Schleife auch den Typ char haben?

+
+
+
+

4.12. Frage

+
+

Ein Student und eine Studentin schreiben den folgenden for-Kopf, um die Summe der Zahlen von 1 bis 50 zu berechnen: for(i = 1, sum = 0; i ⇐ 50; sum = i+); Was sagt Ihnen Ihr Programmierverstand?

+
+
+

(Übrigens: Der Kopf der Schleife ist syntaktisch korrekt, da liegt nicht das Problem!)

+
+
+
+

4.13. Frage

+
+

Schreiben Sie die folgende For-each-Schleife mit einer normalen for-Schleife: for(int x: ar) { System.out.println(x); }

+
+
+
+

4.14. Frage

+
+

Was ist der Unterschied zwischen einer while-Schleife und einer do-while-Schleife? In welchem Fall ist die eine sinnvoller, in welchem die andere?

+
+
+
+

4.15. Frage

+
+

Man kann jede for-Schleife in eine while- bzw. do/while-Schleife umwandeln. Stimmt das?

+
+
+
+

4.16. Frage

+
+

Beschreiben Sie die Ausführung einer for-Schleife:

+
+
+

for(init ; cond ; change) { body ; } Welche Anteile werden in welcher Reihenfolge wiederholt ausgeführt?

+
+
+
+

4.17. Frage

+
+

Herrn Kofler kräuseln sich die Fußnägel, wenn Sie Fließkommazahlen im Kopf einer for-Schleife verwenden. Warum?

+
+
+
+

4.18. Frage

+
+

for(int i = 0; i < 100; i++) { if (i % 2 == 0) System.out.println(i); }

+
+
+

Vervollständigen Sie den folgenden Code so, dass er das gleiche tut wie der oben stehende Code:

+
+
+
+
int i = 0;
+while(true) {
+ // hier bitte Code einfügen
+ System.out.println(i);
+ // hier bitte Code einfügen
+}
+
+
+
+

Sie dürfen bereits bestehende Zeilen nicht mehr ändern, nur welche hinzufügen.

+
+
+
+

4.19. Frage

+
+

Der Kopf for(int i = 1; ; i++) sei gegeben, Sie dürfen ihn nicht verändern. Allerdings darf die Schleife nur für i bis 50 laufen. Retten Sie das im Rumpf!

+
+
+
+
+
+

5. Arrays

+
+
+

5.1. Frage

+
+

Wie lauten die zwei Syntaxvarianten zur Deklaration einer (eindimensionalen) Array-Variable?

+
+
+
+

5.2. Frage

+
+

Kann die Größe von Java-Array nachträglich verändert werden? Warum/Warum nicht?

+
+
+
+

5.3. Frage

+
+

Seite 121: "Arrays können auch in for-each-Schleifen durchlaufen werden. Die Array-Elemente können dann jedoch nur gelesen, nicht aber verändert werden."

+
+
+

Warum können die Elemente nicht verändert werden? Erläutern Sie.

+
+
+
+

5.4. Frage

+
+

Seite 121: Was ist wohl mit "echten mehrdimensionalen Arrays" gemeint?

+
+
+
+

5.5. Frage

+
+

Seite 122: Warum for(int j=0; j<x[i].length; j)` beim Durchlauf von zweidimensionalen Arrays? Warum nicht `for(int j=0; j<x[0].length; j)?

+
+
+
+

5.6. Frage

+
+

Ist \u0000 wirklich das Zeichen 0? Deklarieren Sie in der JShell ein leeres char-Array und geben Sie den Inhalt aus.

+
+
+
+

5.7. Frage

+
+

Welchen Typ hat ein Array, das auf der Konsole als [Ljava.lang.String;@ff5b51f ausgegeben wird?

+
+
+
+

5.8. Frage

+
+

Wie könnte man eine "schönere" String-Darstellung des Arrays aus der letzten Aufgabe erhalten?

+
+
+
+

5.9. Frage

+
+

Was ist eine Shallow-Copy?

+
+
+
+

5.10. Frage

+
+

Worauf muss man beim Kopieren von mehrdimensionalen Arrays achten?

+
+
+
+

5.11. Frage

+
+

Was müsste man tun, um eine Deep-Copy eines Arrays zu erhalten?

+
+
+
+

5.12. Frage

+
+

Es gibt zwei Probleme mit dem folgenden Snippet. Welche? +Array.sort(new int[]{5,7,-1,3,2})

+
+
+
+

5.13. Frage

+
+

Seite 126: Ändern Sie die Deklaration des Arrays so, dass der Code von Herrn Kofler auf die Nase fällt. Sie dürfen weder den Typ noch den Namen des Arrays verändern.

+
+
+
+
+
+

6. Zeichenketten

+
+
+

6.1. Frage

+
+

Wir ist die Schreibweise für ein Einzelzeichen-Literal?

+
+
+
+

6.2. Frage

+
+

Bei Literalen für Einzelzeichen hat der Backslash \ eine Sonderfunktion: Welche? (Wie nennt man den "Backslash"? Er ist das sogenannte ___zeichen.)

+
+
+
+

6.3. Frage

+
+

Was bedeutet "Unicode"?

+
+
+
+

6.4. Frage

+
+

Wie prüfen Sie, ob ein char c eine Ziffer oder ein Großbuchstabe ist?

+
+
+
+

6.5. Frage

+
+

Definieren Sie eine char-Variable, die das Unicode-Symbol "Airplane" (U+2708) enthält.

+
+
+
+

6.6. Frage

+
+

Ich gebe Ihnen ein geheimnisvolles Einzelzeichen geheim. Ermitteln Sie, welches Einzelzeichen geheim vorangeht und welches ihm folgt.

+
+
+
+

6.7. Frage

+
+

Was ergibt 'T' + 'H' + 'M'?

+
+
+
+

6.8. Frage

+
+

Was ergibt "" + 'T' + 'H' + 'M'?

+
+
+
+

6.9. Frage

+
+

Was ergibt 'T' + 'H' + 'M' + ""?

+
+
+
+

6.10. Frage

+
+

Wie machen Sie aus "MNI" eine Folge von Einzelzeichen?

+
+
+
+

6.11. Frage

+
+

Erstellen Sie die Zeichenkette "C:\Users\mni\oop\" (Windows-Stil) als Pfad-Angabe unter Java.

+
+
+
+

6.12. Frage

+
+

Beschreiben Sie den visuellen Effekt der Zeichenkette "\n\tTest\n".

+
+
+
+

6.13. Frage

+
+

Initialisieren Sie String s als leere Zeichenkette!

+
+
+
+

6.14. Frage

+
+

Gegeben sei das Array String[] s. Wir möchten davon eine Kopie anlegen. Muss man eine deep copy anfordern, reicht eine shallow copy oder genügt gar eine einfache Zuweisung?

+
+
+
+

6.15. Frage

+
+

Warum sollte man eine Zeichenkette niemals mit == vergleichen?

+
+
+
+

6.16. Frage

+
+

Ergibt "abc" == "abc" immer true oder kann es vielleicht auch mal false ergeben?

+
+
+
+

6.17. Frage

+
+

Was liefert der Vergleich "aaa" > "abc"?

+
+
+
+

6.18. Frage

+
+

Was ergibt String.valueOf("String")?

+
+
+
+

6.19. Frage

+
+

Welchen Formatierungscode brauchen Sie, um eine Fließkommazahl mit drei Nachkommastellen darzustellen?

+
+
+
+

6.20. Frage

+
+

Alles happy? int i = 3; System.out.println(i.toString());

+
+
+
+

6.21. Frage

+
+

Warum gibt es String.valueOf(), wenn es doch die toString()-Methode gibt?

+
+
+
+

6.22. Frage

+
+

Trennen Sie die Zeichenkette C:\Users\mni\oop\ mit der Methode split in die einzelnen Pfadbestandteile auf. Welches Problem ergibt sich dabei?

+
+
+
+

6.23. Frage

+
+

Geben Sie ein String-Format an, das die Zahl 12.345678f nur mit exakt zwei Nachkommastellen angibt. (edited)

+
+
+
+

6.24. Frage

+
+

Gegeben sei float[] floats = { 1.234f, 12.56f, 123f }. Gehen Sie in einer Schleife durch das Array und geben Sie die Zahlen untereinander aus. Die Kommas sollen positionsgleich untereinander stehen, eine Nachkommastelle ist relevant. (edited)

+
+
+
+

6.25. Frage

+
+

Welcher Hex-Darstellung entspricht 2017?

+
+
+
+

6.26. Frage

+
+

In einer String-Variable namens geheim steht ein Dateiname. Finden sie die Dateiendung heraus (der Teil nach dem letzten Punkt im Namen).

+
+
+
+

6.27. Frage

+
+

Sie treffen auf Aliens, die Ihnen auf eine Tafel die Zahl "110" schreiben. Sie stellen fest, dass die Aliens an ihren beiden Händen insgesamt 6 Finger haben. Wie lautet die Zahl also im 6er-System?

+
+
+

(Schon "Arrival" im Kino geschaut?)

+
+
+
+

6.28. Frage

+
+

Long.parseLong("55",5) — Autsch! Warum?

+
+
+
+

6.29. Frage

+
+

Long.parseLong("55L") — Autsch! Schade! Warum schade?

+
+
+
+

6.30. Frage

+
+

In welchen Fällen ist der Einsatz der Klasse StringBuilder sinnvoll?

+
+
+
+

6.31. Frage

+
+

Sie wollen sicherstellen, dass Java bei der Übersetzung Ihres Java-Programms die Java-Datei in der Kodierung UTF-8 einliest. Wie machen Sie das?

+
+
+
+

6.32. Frage

+
+

StringBuilder s1 = new StringBuilder("Hallo "); StringBuilder s2 = new StringBuilder("Welt"); Wären s1 und s2 Strings, so könnten Sie beide mit s1+s2 konkatenieren. Wie lösen Sie das Problem vergleichbar hier?

+
+
+
+

6.33. Frage

+
+

Das Programm auf Seite 147/148 zählt Groß- und Kleinbuchstaben in einem String. Wäre statt der if-Anweisungen nicht ein switch passender und würde den Code lesbarer machen?

+
+
+
+

6.34. Frage

+
+

Zeichensatzprobleme gibt es nicht nur in Quellcodedateien, sondern auch immer dann wenn Zeichenketten von außerhalb in das Programm kommen oder ausgegeben werden (z.B. über das Netzwerk oder aus einer Datei). Um zwischen verschiedenen Kodierungen wechseln zu können bietet die Klasse String den Konstruktor String(byte[], Charset) und die Methode getBytes(Charset).Wandeln Sie das Zeichen ä (unicode \u00e4) erst in US_ASCII um und lesen das resultierende Byte-Array wieder so ein als wäre es UTF_8-kodiert.

+
+
+
+
+
+

7. Datum und Uhrzeit

+
+ +
+
+
+

8. Methoden

+
+
+

8.1. Frage

+
+

Haben Klassen Methoden? Oder haben Objekte Methoden?

+
+
+
+

8.2. Frage

+
+

In Java gibt es Klassen, die nur statische Methoden haben. Macht das Sinn? Nennen Sie ein Beispiel.

+
+
+
+

8.3. Frage

+
+

Wie sieht der syntaktische Aufbau des Kopfes einer Methode aus? Beginnen Sie beim Rückgabetyp.

+
+
+
+

8.4. Frage

+
+

Jemand schreibt die Methode void Sort(String[] passwords) und bekommt sofort Schelte von seinen Kolleg(inn)en. Warum?

+
+
+
+

8.5. Frage

+
+

Wenn Arrays.sort() ein bestehendes Array verändern kann, könnte man dann auch eine Methode void increment(int i) {…​} schreiben, die eine bestehende Integer-Variable verändert?

+
+
+
+

8.6. Frage

+
+

In jedem Java-Programm muss es genau eine main-Methode geben. Wie muss der Kopf der main-Methode aussehen?

+
+
+
+

8.7. Frage

+
+

static Car getCar() { return this.car; } Autsch! Warum?

+
+
+
+

8.8. Frage

+
+

In welchem Fall muss eine Methode in ihrem Rumpf eine return-Anweisung enthalten?

+
+
+
+

8.9. Frage

+
+

Die Methode String.valueOf muss mit sehr vielen verschiedenen Datentypen als Parameter umgehen. Wie kann es sein, dass man an die Methode sowohl einen double als auch einen char übergeben kann und trotzdem immer das richtige Ergebnis bekommt?

+
+
+
+

8.10. Frage

+
+

float numberOne() { return 1.0; } Autsch oder nicht Autsch, das ist hier die Frage!

+
+
+
+

8.11. Frage

+
+

Könnte man den Parameter args der Main-Methode auch als eine variable Anzahl von Strings definieren? Probieren Sie es aus!

+
+
+
+

8.12. Frage

+
+

Eine Methode sei mit einem Argument deklariert (keine Überladung), sie wird jedoch mit drei Argumenten aufgerufen — und Java akzeptiert das klaglos. Wie muss die Methode deklariert worden sein?

+
+
+
+

8.13. Frage

+
+

Was ist der sogenannte CallStack?

+
+
+
+

8.14. Frage

+
+

Ist die folgende Definition von überladenen Methoden zulässig?

+
+
+
+
float foo(int x) { return x; }
+float foo(int ... x) { return x[0]; }
+
+
+
+
+

8.15. Frage

+
+

Auf welche Weisen kann man eine Methode "überladen"?

+
+
+
+

8.16. Frage

+
+

void doStuff(int …​ x, String y) { …​ } - Geht das?

+
+
+
+

8.17. Frage

+
+

Was ist der Grund, wenn der CallStack überläuft?

+
+
+
+

8.18. Frage

+
+

Definieren Sie eine Methode floatEquals, die zwei float-Werte a und b und einen optionalen dritten float Wert tolerance übernimmt und einen boolean zurückgibt.

+
+
+
+

8.19. Frage

+
+

Welche Informationen werden auf dem CallStack gespeichert?

+
+
+
+

8.20. Frage

+
+

Wenn man einen Parameter mit final ausweist verhindert das …​ was?

+
+
+
+

8.21. Frage

+
+
+
void foo() {
+  return;
+  System.out.println("returned");
+}
+
+
+
+

Geht das?

+
+
+
+

8.22. Frage

+
+
+
void bar() {
+  if (true) return;
+  System.out.println("returned");
+}
+
+
+
+

Und das?

+
+
+
+

8.23. Frage

+
+

return(0) statt return 0 ist in Java zulässig. Geht auch return() statt return für void-Methoden?

+
+
+
+

8.24. Frage

+
+

Läuft der Code?

+
+
+
+
void flopp(int n) {
+    if (true) return;
+}
+
+
+
+
+

8.25. Frage

+
+

Und dieser hier?

+
+
+
+
int flopp(int n) {
+    if (true) return 0;
+}
+
+
+
+
+

8.26. Frage

+
+

Was passiert bei der Ausführung dieser Methode?

+
+
+
+
float baz(float x) {
+  try {
+    if (x < 0) return 0;
+    x *= 2;
+    return x;
+  } finally {
+    System.out.println("returned from call baz(" + x + ")");
+  }
+}
+
+
+
+
+

8.27. Frage

+
+
+
int rek(int n) {
+  if(n == 0) return 0;
+  return 2 * rek(n - 2);
+}
+
+
+
+

Geht das gut?

+
+
+
+

8.28. Frage

+
+

Bei der Rekursion unterscheidet man stets den Abbruch- und den Wiederholungsfall. Erklären Sie das am Beispiel der rekursiven Implementierung der Fakultätsfunktion.

+
+
+
+

8.29. Frage

+
+
+
int fib(int n) { return n < 2 ? n : fib(n-1) + fib(n-2); }
+
+
+
+

Listen Sie die Aufrufe der Methode fib nacheinander auf, die ausgelöst werden, wenn int x = fib(4); ausgeführt wird.

+
+
+
+

8.30. Frage

+
+
+
boolean isOdd(int n) {
+  return n >= 0 && (n == 0 || isOdd(n-2));
+}
+
+
+
+

Funktioniert das?

+
+
+
+

8.31. Frage

+
+

Es gibt einen Klassiker zur sogenannten wechselseitigen Rekursion: Methode boolean isOdd(int n) ruft boolean isEven(int n) auf und umgekehrt. Dabei reduziert jede Methode den Zahlenwert um 1, bevor der Gegenpartner aufgerufen wird. Was ist der jeweilige Abbruchfall? Implementieren Sie diese Rekursion.

+
+
+
+

8.32. Frage

+
+
+
int foo(int n) {
+  if (n > 100) return n-10;
+  else return foo(foo(n+11));
+}
+
+
+
+

WTF? Ist das erlaubt?

+
+
+
+
+
+

9. Exceptions

+
+
+

9.1. Frage

+
+

Wenn eine Exception geworfen wird, dann sieht sich Java zur Laufzeit außerstande …​?

+
+
+
+

9.2. Frage

+
+

Kann javac, der Java-Compiler, eine Exception zu Ihrem Code werfen?

+
+
+
+

9.3. Frage

+
+

Die Informationen, die zu einer Exception geführt haben, werden wie kommuniziert?

+
+
+
+

9.4. Frage

+
+

Wie heißt die oberste Klasse in der Exception-Hierarchie?

+
+
+
+

9.5. Frage

+
+

Was ist ein Stack Trace?

+
+
+
+

9.6. Frage

+
+

Wenn eine Exception vom Typ Error geworfen wird, dann hat das was für Konsequenzen?

+
+
+
+

9.7. Frage

+
+

Was unterscheidet Exceptions, die von RuntimeException erben von anderen Subklassen von Exception?

+
+
+
+

9.8. Frage

+
+

Warum ist der Name RunTimeException für eine der Exception-Klassen ein wenig unsinnig? (edited)

+
+
+
+

9.9. Frage

+
+

In welchem Fall muss im Kopf einer Methode throws samt Angabe der möglichen Ausnahme(n) stehen?

+
+
+
+

9.10. Frage

+
+

Wenn catch-Blöcke identischen Code haben, bietet sich eine Verkürzungsform an. Beschreiben Sie den syntaktischen Aufbau des "verkürzten" catch-Kopfes.

+
+
+
+

9.11. Frage

+
+

Die StackTrace eines StackOverflowError ist sehr lang. Warum?

+
+
+
+

9.12. Frage

+
+

try { /* some code */ } and there is something wrong.

+
+
+
+

9.13. Frage

+
+

Was ist der Vorteil eines try-with-resources gegenüber einem normalen finally-Block?

+
+
+
+

9.14. Frage

+
+

Anschlussfrage: Was ist eine resource?

+
+
+
+

9.15. Frage

+
+

Ein Student schreibt folgende main-Methode und wird sofort dafür gescholten. Warum?

+
+
+
+
public static void main(String[] args) throws Throwable {
+  // ...
+}
+
+
+
+
+

9.16. Frage

+
+

Was macht die assert-Anweisung?

+
+
+
+

9.17. Frage

+
+
+
try {
+  // dangerous stuff
+} catch (Exception e) {
+  e.printStackTrace();
+} catch (NumberFormatException nfe) {
+  System.err.println("Stupid user input!")
+}
+
+
+
+

Geht das?

+
+
+
+

9.18. Frage

+
+

Sie haben in Ihrem Code assert-Anweisungen, die eigentlich eine Exception auslösen müssten (Beispiel: assert false;). Die Exceptions bleiben aus. Was ist los?

+
+
+
+

9.19. Frage

+
+

Kann man selbst Exceptions definieren?

+
+
+
+
+
+

10. Klassen

+
+
+ + + + + +
+ + +
+

Hinweis: Tabelle 10.1, Modifizierer, müssen Sie können.

+
+
+
+
+

Es kam die Frage auf, warum man in einer Klasse überhaupt Felder und Methoden nicht static machen soll. Hier ein Versuch, unsere Diskussion nachzuzeichnen.

+
+
+

Wir erstellen eine Klasse Car und geben ihr das statische Feld owner. Die Besitzerin heiße Lisa.

+
+
+
+
jshell> class Car { static String owner; }
+|  created class Car
+
+jshell> Car.owner = "Lisa"
+$13 ==> "Lisa"
+
+
+
+

Lisa hat zwei Autos. Also instanziieren wir zwei Autos. Jedes dieser Autos können wir nach dem Wert des Felds owner befragen.

+
+
+
+
jshell> Car car1 = new Car()
+car1 ==> Car@148080bb
+
+jshell> car1.owner
+$15 ==> "Lisa"
+
+jshell> Car car2 = new Car()
+car2 ==> Car@6e1ec318
+
+jshell> car2.owner
+$17 ==> "Lisa"
+
+
+
+

Nun verkauft mir Lisa eines der Autos — sie erklärt sich einverstanden, dass ich als neuer Eigentümer ihres zweiten Autos eingetragen werde.

+
+
+
+
jshell> car2.owner = "Dominikus"
+$18 ==> "Dominikus"
+
+
+
+

Weil owner eine statische Klassenvariable ist, habe ich Lisa nun auch ihr anderes Auto abgeluchst, dessen Eigentümer ich nun ebenfalls bin.

+
+
+
+
jshell> car2.owner = "Dominikus"
+$18 ==> "Dominikus"
+
+
+
+

Zauberei? Betrug? Mitnichten, es liegt an der statischen Klassenvariablen. Wäre owner keine statische Klassenvariable gewesen, dann hätte jedes Auto seinen eigenen Wert für einen Eigentümer speichern können — und Lisa hätte mir nicht unfreiwillig all ihre Autos abgetreten. Probieren Sie’s aus!

+
+
+

Was lernen wir? Ein statisches Feld enthält einen Wert, den die Klasse speichert und der für alle Instanzen der Klasse gleich ist. Ein "normales", nicht statisches Feld ist eine Variable, die jede Instanz für sich individuell angelegt bekommt. Und genau das möchte Objektorientierung: jeder Instanz eine eigene Umgebung für (nicht statische) Klassenvariablen mitgeben.

+
+
+

10.1. Frage

+
+

Herr Kofler nennt welche Vorteile, die Objektorientierung bietet?

+
+
+
+

10.2. Frage

+
+

Wann ist eine Klasse keine top level-Klasse?

+
+
+
+

10.3. Frage

+
+
+
void foo() {
+ class StrangeThing {
+   boolean isStrange = true;
+ }
+ StrangeThing thing = new StrangeThing();
+ System.out.println(thing.isStrange);
+}
+
+
+
+

Geht das?

+
+
+
+

10.4. Frage

+
+

Wie sieht schematisch die Syntax zur Klasse aus? [ohne Annotationen und Generics]

+
+
+
+

10.5. Frage

+
+

In einer .java-Datei können mehrere Klassen deklariert werden. Allerdings gilt eine Einschränkung, was den Namen der Datei angeht. Welche?

+
+
+
+

10.6. Frage

+
+

Schreibe class test und schon ist der Kopf ab, bevor auch nur ein { folgt. Warum? [Gemeint ist Ihr Kopf, nicht der der Klassendeklaration :upside_down_face:!)

+
+
+
+

10.7. Frage

+
+

Eine top level-Klasse darf welche Sichtbarkeiten nicht haben?

+
+
+
+

10.8. Frage

+
+

Gibt es in Java das Laufzeitkonstrukt der Klasse?

+
+
+
+

10.9. Frage

+
+

Gibt es in Java das Laufzeitkonstrukt des Objekts?

+
+
+
+

10.10. Frage

+
+
+
class Thing {
+ private class PartOfThing {
+   String name = "part";
+ }
+}
+
+
+
+

Geht das?

+
+
+
+

10.11. Frage

+
+

Auf welcher Ebene ist die Klasse class A {} sichtbar?

+
+
+
+

10.12. Frage

+
+

Was ist eine Klassenvariable? Doch dasselbe wie ein statisches Feld, oder?

+
+
+
+

10.13. Frage

+
+

Klären Sie die Begriffe "Feld" und "Variable".

+
+
+
+

10.14. Frage

+
+
+
class Thing {
+ public String name;
+}
+
+
+
+

Kann man auf das Feld name von anderen Paketen aus zugreifen?

+
+
+
+

10.15. Frage

+
+

Im Rumpf einer Klasse können welche Sprachkonstrukte deklariert werden?

+
+
+
+

10.16. Frage

+
+
+
class Point {
+ private int x,y;
+ Point(int x, int y) { this.x = x; this.y = y; }
+ boolean equals(Point other) {
+   return this.x == other.x && this.y == other.y;
+ }
+}
+
+
+
+

Ist der Zugriff auf das private Feld other.x erlaubt?

+
+
+
+

10.17. Frage

+
+

Was ist mit dem Begriff "paketsicher" gemeint?

+
+
+
+

10.18. Frage

+
+

Mit welchem Modifizierer kann man die Voraussetzung für einen immutablen (unveränderlichen) Datentyp schaffen? Reicht die Verwendung dieses Modifizierers allein schon aus, um die Immutabilität zu garantieren?

+
+
+
+

10.19. Frage

+
+

Nennen Sie die einzelnen Schritte, die bei einem Aufruf von new ausgeführt werden.

+
+
+
+

10.20. Frage

+
+

Wie sieht das Schema zum Zugriff auf eine statische Variable bzw. zum Aufruf einer statischen Methode aus?

+
+
+
+

10.21. Frage

+
+

Recherchieren Sie: In der OOP-Veranstaltung hatten wir ein Beispiel, in dem wir eine statische Klassenvariable genutzt haben. Worum ging es bei dem Beispiel? Welchen Zweck hatte die statische Klassenvariable?

+
+
+
+

10.22. Frage

+
+
+
class Point {
+ int x = 0, y = 0;
+ Point(int x, int y) { this.x = x; this.y = y; }
+}
+Point p = new Point();
+
+
+
+

Autsch! Warum?

+
+
+
+

10.23. Frage

+
+

Deklarieren Sie eine Klasse, von der keine Objekte erzeugt werden können.

+
+
+
+

10.24. Frage

+
+

Ein Konstruktor ist mit einer Methodendeklaration sehr vergleichbar. Nur: Der Konstruktor hat zwar einen Namen, ihm scheint jedoch der Rückgabetyp zu fehlen. Warum?

+
+
+
+

10.25. Frage

+
+

Was sind die Defaultwerte für Felder (Klassenvariablen)? Was sind die Defaultwerte für lokale Variablen?

+
+
+
+

10.26. Frage

+
+

Warum kann man finalize nicht für Aufräumarbeiten verwenden?

+
+
+
+

10.27. Frage

+
+

Wie ruft man im Konstruktor einen anderen Konstruktor der gleichen Klasse auf? Warum sollte man das überhaupt tun wollen?

+
+
+
+

10.28. Frage

+
+
+
class A {
+ int a,b;
+ A() {
+   a = 0;
+   this(0);
+ }
+ A(int x) {
+   a = 1;
+   b = x;
+ }
+}
+
+
+
+

Autsch! Warum?

+
+
+
+

10.29. Frage

+
+

Im Vorgriff auch das nächste Kapitel: Wie ruft man im Konstruktor den Konstruktor der Oberklasse auf?

+
+
+
+

10.30. Frage

+
+

Was ist die Besonderheit des Interfaces AutoCloseable? Welche Methoden deklariert es?

+
+
+
+

10.31. Frage

+
+

Ist this eine Variable?

+
+
+
+

10.32. Frage

+
+

Ist es nicht das gleiche, ob eine Klasse jetzt ein public int x definiert oder ein private int x mit den Methoden int getX() und void setX(int x)? Wo liegt der Unterschied?

+
+
+
+

10.33. Frage

+
+

Wozu benötigt man this?

+
+
+
+

10.34. Frage

+
+

Wenn man sich in den Namensgebungen für Parameter und lokale Variablen diszipliniert, benötigt man dann überhaupt noch this?

+
+
+
+

10.35. Frage

+
+

Wenn an den Konstruktor "falsche" Werte übergeben werden, empfiehlt es sich mit einer Exception darauf zu reagieren. Welche Exception sollte man wählen, sofern man nicht spezifischer sein kann/möchte?

+
+
+
+

10.36. Frage

+
+

Wenn es einen Konstruktor gibt, muss es auch einen Destruktor geben, nicht wahr?! Hat Java einen Destruktor? Begründen Sie Ihre Antwort!

+
+
+
+

10.37. Frage

+
+

Eine Klasse, die eine close-Methode anbietet sollte die Schnittstelle AutoCloseable implementieren. Warum?

+
+
+
+

10.38. Frage

+
+

Was ist mit "Settern" und "Gettern" gemeint?

+
+
+
+

10.39. Frage

+
+

Was ist damit gemeint, wenn man von einer "Datenklasse" spricht?

+
+
+
+

10.40. Frage

+
+

Wenn Sie Setter- und Getter-Methoden implementieren, dann sollten die Felder wie deklariert sein?

+
+
+
+

10.41. Frage

+
+

Oft sieht man Setter wie public setName(Typ value) { name = value; }. Was könnte man daran kritisieren?

+
+
+
+

10.42. Frage

+
+

Aufgrund welchen Prinzips der Softwaretechnik werden Setter und Getter begründet?

+
+
+
+

10.43. Frage

+
+

Welcher softwaretechnische Nutzen steckt vor allem in den Setter-Methoden?

+
+
+
+

10.44. Frage

+
+

Warum ist der Begriff "Unterklasse" für eine innere Klasse problematisch?

+
+
+
+

10.45. Frage

+
+
+
class A {
+  int x;
+  class B {
+    int x;
+    int foo(int x) {
+       // zähle alle drei mit x benannten Variablen zusammen
+    }
+  }
+}
+
+
+
+

Welcher Code muss an der markierten Stelle stehen, um den Wert von allen drei Variablen zusammenzuzählen? Wie unterscheidet man sie voneinander?

+
+
+
+

10.46. Frage

+
+

this.name oder name.this, das ist hier die Frage!

+
+
+
+

10.47. Frage

+
+
+
AutoCloseable a = new AutoCloseable() {
+  public void close() { System.out.println("closed"); }
+}
+
+
+
+

Warum geht das, obwohl AutoCloseable a = new AutoCloseable(); einen Fehler produziert?

+
+
+
+

10.48. Frage

+
+

Kann eine anonyme Klasse einen Konstruktor haben? Warum, oder warum nicht?

+
+
+
+

10.49. Frage

+
+
+
class A {
+    static int b;
+    class C {
+        static int d;
+    }
+}
+
+
+
+

Sie dürfen eine Sache streichen, damit der Code gültig wird.

+
+
+
+

10.50. Frage

+
+

Erzeugen Sie eine anonyme Unterklasse von java.awt.Point, die die Methode toString so überschreibt, dass die String-Repräsentation jetzt einfach der mathematischen Schreibweise (x, y) entspricht. Wie können Sie beim Erzeugen des Objektes dieser Klasse die Koordinaten x und y übergeben?

+
+
+
+

10.51. Frage

+
+
+
Object obj = new Object() {
+  public void myFancyNewMethod() { /* do stuff */ }
+}
+
+
+
+

Macht das Sinn?

+
+
+
+

10.52. Frage

+
+

Eine Instanz einer anonyme Klasse kann nur auf bestimmte Variablen des Kontextes zugreifen, in dem sie erzeugt wurde. Welche Variablen sind das?

+
+
+
+

10.53. Frage

+
+

Definieren Sie, was effectively final heißt?

+
+
+
+

10.54. Frage

+
+

AutoCloseable a = () → System.out.println("auto"); Wie nennt man so etwas?

+
+
+
+

10.55. Frage

+
+
+
String message = "foo";
+AutoCloseable a = new AutoCloseable() {
+  public void close() { System.out.println(message); }
+};
+message = "bar";
+
+
+
+

Alles in Butter, oder doch nicht?

+
+
+
+

10.56. Frage

+
+
+
class A {
+   static int b;
+   class C {
+       static int d;
+   }
+}
+
+
+
+

Sie dürfen eine Sache ergänzen, damit der Code gültig wird.

+
+
+
+

10.57. Frage

+
+

Warum sind laut Herrn Kofler statische innere Klassen gar keine "inneren Klassen" im eigentlichen Sinne?

+
+
+
+

10.58. Frage

+
+

Kann man eine Klasse mit dem qualifizierten Namen A.B.C definieren? Wenn ja, wie? (Die Punkte sind Teil des Namens.)

+
+
+
+
+
+

11. Vererbung und Schnittstellen

+
+
+

Zu Beginn zwei Beispiele zur Polymorphie. Das Wort "Polymorphie" setzt sich aus zwei Teilen zusammen: poly für "viele" (sie kennen vielleicht das Wort "Polyphonie" als Mehrstimmigkeit) und morph für "Gestalt"; Polymorphie ist die Mehrgestaltigkeit. In der Objektorientierung ist damit gemeint, dass sich ein Objekt je nach Art der Gestalt (seinem Typ entsprechend) angepasst auf einen Methodenaufruf verhält.

+
+
+

Das Codebeispiel: Menschen (humans) sprechen anders als Tiere (animals). Im Beispiel ist eine Oberklasse nötig, um in einem Array sowohl Instanzen von Human wie auch von Animal aufnehmen zu können.

+
+
+
+
class Being {
+    String say(String text) {
+        return this.getClass().getName() + " says ";
+    }
+}
+
+class Human extends Being {
+    String say(String text) {
+        return super.say(text) + text;
+    }
+}
+
+class Animal extends Being {
+    String say(String text) {
+        return super.say(text) + "nothing (can't talk)";
+    }
+}
+
+Being[] beings = { new Human(), new Animal(), new Animal() };
+for(Being b : beings) System.out.println(b.say("good morning"));
+
+
+
+

Eine Alternative dazu definitert ein Interface namens Talker. Nun können die Klassen nicht auf eine gemeinsame Implementierung über die Oberklasse zugreifen; es besteht — was durchaus von Vorteil ist — auch gar keine Notwendigkeit mehr, eine Oberklasse einzuführen.

+
+
+
+
interface Talker {
+    String say(String text);
+}
+
+class Human implements Talker {
+    public String say(String text) {
+        return "Human says " + text;
+    }
+}
+
+class Animal implements Talker {
+    public String say(String text) {
+        return "Animal says nothing (can't talk)";
+    }
+}
+
+Talker[] talkers = { new Human(), new Animal(), new Animal() };
+for(Talker t : talkers) System.out.println(t.say("good morning"));
+
+
+
+

Im ersten Fall der Polymorphie ist den "vielen Gestalten" eine Oberklasse gemeinsam (sie definiert, was die Gestalt ist), im zweiten Fall ist den "vielen Gestalten" eine Schnittstelle gemeinsam (sie definiert, was die Gestalt kann), die jede teilhabende Klasse für sich implementiert.

+
+
+ + + + + +
+ + +
+

Hinweis zu Kap. 11.2: Sie müssen all die Methoden kennen, die Object hat und vererbt. Von notify, notifyAll und wait müssen Sie nur wissen, dass es sie gibt. Das Verständnis dazu erschließt sich erst, wenn wir uns mit Threads beschäftigen [nicht dieses Semester].

+
+
+
+
+ + + + + +
+ + +
+

Mehr zu Hashcodes können Sie z.B. nachlesen unter https://de.wikipedia.org/wiki/Hashfunktion. Hashcodes begegnen Ihnen im Informatik-Alltag immer wieder.

+
+
+
+
+ + + + + +
+ + +
+

Tabelle 11.1 (Schnittstellenübersicht) ist Gold wert! Lernen.

+
+
+
+
+

11.1. Frage

+
+

Wenn Sie class A extends B sehen, wissen Sie, dass B was an A vererbt?

+
+
+
+

11.2. Frage

+
+

Wenn das hier geht Object getSelf() { return this; }, geht dann auch das Object getSelf() { return super; }?

+
+
+
+

11.3. Frage

+
+

Ordnen Sie (siehe letztes Beispiel) die Begriffe A oder B zu:

+
+
+
    +
  • +

    Oberklasse

    +
  • +
  • +

    Unterklasse

    +
  • +
  • +

    abgeleitete Klasse

    +
  • +
  • +

    Subklasse

    +
  • +
  • +

    generalisierende Klasse

    +
  • +
  • +

    spezialisierende Klasse

    +
  • +
  • +

    Basisklasse

    +
  • +
+
+
+
+

11.4. Frage

+
+

Wann ist die Implementierung eines eigenen Konstruktors in einer abgeleiteten Klasse nicht optional?

+
+
+
+

11.5. Frage

+
+

Wenn man eine Methode überschreibt, dann ist die Verwendung einer Annotation üblich. Welcher?

+
+
+
+

11.6. Frage

+
+

Eine Method überladen und sie überschreiben ist nicht dasselbe. Erkläre den Unterschied!

+
+
+
+

11.7. Frage

+
+
+
class A { int method(int i) { return i+1; } }
+class B extends A { int method() { return 2; } }
+
+
+
+

Überschreibt B die Methode von A? Oder überlädt B die Methode?

+
+
+
+

11.8. Frage

+
+

Mit welchem Schlüsselwort kann auf Members (Felder und Methoden) der Oberklasse zugegriffen werden?

+
+
+
+

11.9. Frage

+
+

Wie Sie wissen, ist jede Klasse abgeleitet von Object. Wenn Sie Code wie class A { } sehen, welche Ergänzungen daran nimmt der Compiler vermutlich vor?

+
+
+
+

11.10. Frage

+
+

Kann eine abstrakte Klasse einen Konstruktor haben?

+
+
+
+

11.11. Frage

+
+

Wenn ich etwas super(…​) machen will, wohin damit?

+
+
+
+

11.12. Frage

+
+

Ich möchte gerne den Konstruktor der Ober-Oberklasse aufrufen. Wie geht das?

+
+
+
+

11.13. Frage

+
+

Hans deklariert eine Klasse als final, Hannah als abstract. Was hat Hans mit der Klasse vor, was Hannah?

+
+
+
+

11.14. Frage

+
+

Hannah deklariert eine Methode als final, Hans als abstract. Woran muss Hans denken, was Hannah egal sein kann? Und was kann Hans sein lassen, was Hannah wiederum tun muss?

+
+
+
+

11.15. Frage

+
+
+
class A { int x; }
+class B extends A { void foo() { x += 1; } }
+class C extends A { void foo() { x *= 2; } }
+A obj = new B();
+obj.foo();
+
+
+
+

Wie kann man diesen Code retten?

+
+
+
+

11.16. Frage

+
+
+
class A {
+   void m() { System.out.println("mA"); }
+}
+
+class B extends A {
+   void m() { System.out.println("mB"); }
+}
+
+
+
+

Nun: A a = new B() bzw. B a = new B(). Was liefert in jedem der Fälle a.m() auf der Konsole?

+
+
+
+

11.17. Frage

+
+
+
for (Object o : objects) {
+ String s = (String) o;
+ System.out.println(s);
+}
+
+
+
+

Ist das eine gute Idee? Warum?

+
+
+
+

11.18. Frage

+
+
+
Object o = "abc";
+int l = (String) o.length();
+
+
+
+

Ooops, was ist da schiefgegangen?

+
+
+
+

11.19. Frage

+
+

Ein …​cast passiert implizit, wenn ein Objekt einer Variable von einem Supertyp zugewiesen wird. Ein …​cast muss dagegen explizit angegeben werden.

+
+
+
+

11.20. Frage

+
+

Was bedeutet das Wort "Polymorphie" von seiner sprachlichen Herkunft?

+
+
+
+

11.21. Frage

+
+

Was gibt die Methode toString standardmäßig zurück?

+
+
+
+

11.22. Frage

+
+

Eine Klasse, die als class A {} deklariert wird, wird vom Compiler als class A extends Object {} aufgefasst. Wie ist das bei class A extends B {}? Ist eine Deklaration der Form class A extends B, Object {} oder class A extends B extends Object {} überhaupt erlaubt?

+
+
+
+

11.23. Frage

+
+

Die Aussage ist nicht ganz korrekt: "`getClass` gibt die Klasse einer Instanz zurück." Berichtigen Sie den Satz.

+
+
+
+

11.24. Frage

+
+
+
class Foo {
+  int x;
+  public boolean equals(Object other) {
+    if (other instanceof Foo) {
+      Foo f = (Foo) other;
+      return f.x == x;
+    }
+    return false;
+  }
+}
+
+
+
+

Diese Klasse hat laut der Spezifikation der Methode equals ein Problem. Welches ist das?

+
+
+
+

11.25. Frage

+
+

Wie sieht schematisch die Syntax einer Schnittstellen-Deklaration aus? [vereinfachte Variante, so wie Schnittstellen meist verwendet werden]

+
+
+
+

11.26. Frage

+
+

Welche Methodenkörper wären für die Methode hashCode der Klasse java.awt.Point zulässig und sinnvoll?

+
+
+
    +
  • +

    return x + y;

    +
  • +
  • +

    return x;

    +
  • +
  • +

    return y;

    +
  • +
  • +

    return x ^ y;

    +
  • +
  • +

    return (""+x+y).hashCode();

    +
  • +
  • +

    return (x + "," + y).hashCode();

    +
  • +
  • +

    return 0;

    +
  • +
  • +

    return new Random().nextInt();

    +
  • +
+
+
+
+

11.27. Frage

+
+

Was ist richtig?

+
+
+

[ ] interface One extends Two +[ ] interface One implements Two

+
+
+
+

11.28. Frage

+
+

Man kann mit Überladung keine zwei Methoden mit gleicher Signatur erstellen. Schließen Sie daraus, was der Begriff Signatur bedeutet.

+
+
+
+

11.29. Frage

+
+

Eine Schnittstellendeklaration mit genau einer abstrakten Methode heißen?

+
+
+
+

11.30. Frage

+
+

Wie können wir Java überprüfen lassen, ob eine Schnittstelle ein funktionales Interface ist?

+
+
+
+

11.31. Frage

+
+

Wie sieht schematisch die Syntax einer Methode in einer Schnittstelle aus, die mit einer Implementierung versehen ist?

+
+
+
+

11.32. Frage

+
+

Mit der Nutzung von implements im Kopf einer Klassendeklaration verpflichtet sich der Rumpf, was zu tun?

+
+
+
+

11.33. Frage

+
+

Welchen Nutzen haben Schnittstellen außer von einer Klasse eine Implementierungsverpflichtung einzufordern?

+
+
+
+

11.34. Frage

+
+

Karl sagt: "Wozu Schnittstellen, ich kann auch alles mit abstrakten Klassen machen, was Schnittstellen können." Was antwortet ihm Carla darauf?

+
+
+
+

11.35. Frage

+
+

Carla sagt: "Seitdem es default-Implementierungen bei Schnittstellen gibt, sind abstrakte Klassen überflüssig geworden." Was antwortet Karl darauf?

+
+
+
+

11.36. Frage

+
+
+
interface I { void foo(); }
+class A implements I { void foo() {} }
+
+
+
+

Autsch! Warum?

+
+
+
+

11.37. Frage

+
+
+
abstract class A { void foo(); }
+
+
+
+

Aua! Weshalb?

+
+
+
+

11.38. Frage

+
+

interface I { abstract void foo(); } Geht das? Macht das Sinn?

+
+
+
+

11.39. Frage

+
+

Die Frage ist angeregt durch den Code auf S.277 aus Kapitel 12.

+
+
+
+
Geometrie geos = new Geometrie();
+
+
+
+

Ist Geometrie eine Klasse oder ein Interface?

+
+
+
+

11.40. Frage

+
+

Die Frage ist angeregt durch den Code auf S.277 aus Kapitel 12.

+
+
+
+
Geometrie[] geos = new Geometrie[4];
+
+
+
+

Ist Geometrie eine Klasse oder ein Interface?

+
+
+
+
+
+

12. Generische Klassen und Methoden

+
+
+
Die Syntax zu Typparametern
+
+
TypeParameter:
+    {TypeParameterModifier} Identifier [TypeBound]
+
+TypeBound:
+    "extends" TypeVariable
+    "extends" ClassOrInterfaceType {AdditionalBound}
+
+AdditionalBound:
+    "&" InterfaceType
+
+
+
+

Eine Entscheidung:

+
+
+
    +
  1. +

    Wir nehmen aus dem Kapitel 12 das Unterkapitel 12.4 (Wildcards) raus.

    +
  2. +
  3. +

    Wir ignorieren ansonsten die Verwendung von extends bei der Angabe von Typparametern.

    +
  4. +
+
+
+

Wir glauben, dass für Sie als Erstsemester einfache Generics genügen mögen.

+
+
+

Notiz:

+
+
+
+
jshell> class MyClass<N extends Number> { N n = (N)(new Integer(8)); }
+|  Warning:
+|  unchecked cast
+|    required: N
+|    found:    java.lang.Integer
+|  class MyClass<N extends Number> { N n = (N)(new Integer(8)); }
+|                                             ^--------------^
+|  modified class MyClass
+
+jshell> new MyClass<Integer>().n
+$16 ==> 8
+
+jshell> new MyClass<Number>().n
+$17 ==> 8
+
+jshell> new MyClass<Long>().n
+|  java.lang.ClassCastException thrown: java.lang.Integer (in module: java.base) cannot be cast to java.lang.Long (in module: java.base)
+|        at (#18:1)
+
+
+
+

12.1. Frage

+
+

Eine Klasse Container soll im Konstruktor einen beliebigen Typ als Inhalt (content) aufnehmen können. Schreiben Sie den Code ohne Object zu verwenden.

+
+
+
+

12.2. Frage

+
+

Aus unerfindlichen Gründen bietet die Java-API keine Tupel-Klasse an. Wie würde so eine Klasse aussehen, die zwei Variablen von beliebigem Typ enthalten kann?

+
+
+
+

12.3. Frage

+
+

Legen Sie eine neue ArrayList an, die ausschließlich aus Ganzzahlen besteht.

+
+
+
+

12.4. Frage

+
+

Was ist ein Typparameter?

+
+
+
+

12.5. Frage

+
+

Deklarieren und initialisieren Sie eine Variable a, die ausschließlich eine ArrayListe von boolschen Werten aufnehmen kann. Die Lösung muss so kurz wie möglich sein.

+
+
+
+

12.6. Frage

+
+

Wie lautet die Syntax für eine generische Methode?

+
+
+
+

12.7. Frage

+
+

Inwiefern hebelt die Definition <T> T giveMeWhatIWant() { …​ } das Typsystem von Java aus?

+
+
+
+

12.8. Frage

+
+

Wie sieht schematisch die Syntax einer generischen Klasse aus? Reduzieren Sie die Syntax auf das Notwendigste.

+
+
+
+

12.9. Frage

+
+
+
class A<T> { void foo(T x) {} }
+A myA = new A();
+
+
+
+

Kann man das schreiben? Welcher Typ wird für den Typparameter T eingesetzt?

+
+
+
+

12.10. Frage

+
+
+
class Foo<T> {
+  int getLength(T value) {
+    return value.length();
+  }
+}
+Foo<String> f = new Foo<>();
+f.getLength("abc");
+
+
+
+

Oh Schmerz! Weswegen?

+
+
+
+

12.11. Frage

+
+

class Bar<Blubber> { Blubber x; } Problem?

+
+
+
+

12.12. Frage

+
+

Man kann eine Klasse als MyClass<T extends Number> deklarieren, ist auch MyClass<T implements AutoCloseable> erlaubt?

+
+
+
+

12.13. Frage

+
+

class ICanHazGenerics<E extends Comparable> {} Und schon gibt’s was auf die Finger. Was ist der Grund?

+
+
+
+

12.14. Frage

+
+

class A<T extends B> {} Kann man A<B> value = new A<B>(); schreiben? Gilt also B extends B?

+
+
+
+

12.15. Frage

+
+
+
List<? extends Number> lst = new ArrayList<>();
+lst.add(new Integer(8));
+
+
+
+

Die zweite Zeile produziert einen Fehler. Können Sie sich vorstellen, warum man einer List<? extends Number> keinen Integer hinzufügen kann?

+
+
+
+
+
+

13. Lambda-Ausdrücke

+
+ +
+
+
+

14. Collections

+
+
+ + + + + +
+ + +
+

Hinweis: Die forEach-Methode erwartet einen Lambda-Ausdruck. Das kommt noch.

+
+
+
+
+

14.1. Frage

+
+

Welche besondere Bedeutung hat das Interface Iterable in Java?

+
+
+
+

14.2. Frage

+
+

Sie wollen ArrayList verwenden und dürfen nicht vergessen, welches Paket zu importieren?

+
+
+
+

14.3. Frage

+
+

Welche dieser Klassen implementiert das Interface Collection?

+
+
+
    +
  • +

    HashSet

    +
  • +
  • +

    LinkedList

    +
  • +
  • +

    Stack

    +
  • +
  • +

    TreeMap

    +
  • +
+
+
+
+

14.4. Frage

+
+

Auf S.295 oben heißt es: "…​ bietet sich der Einsatz einer List-Klasse an." Ist List eine Klasse?

+
+
+
+

14.5. Frage

+
+
+
Set<Integer> s = new HashSet<Integer>();
+for(int i = 0; i < 100; i++) {
+ int x = new Random().nextInt();
+ if (! s.contains(x)) s.add(x);
+}
+
+
+
+
+

14.6. Frage

+
+

Was bedeutet First in - First out?

+
+
+
+

14.7. Frage

+
+

Warum gibt es für eine Schnittstelle wie z.B. List mehrere Implementierungen wie z.B. ArrayList oder Stack? Woher soll ich wissen, welche Implementierung ich nutzen soll?

+
+
+
+

14.8. Frage

+
+

Den Interfaces Set, List, Stack, Queue und Map liegen anschauliche Vorstellungen zugrunde. Zeichnen Sie für jedes Interface ein Bild, was die zugrunde liegende Abstraktion illustriert. [Das soll helfen, sich zu erinnern, was die Schnittstellen tun.]

+
+
+
+

14.9. Frage

+
+

Warum kann man bei einer Collection die Variante der for-Schleife nutzen, die sich foreach-Schleife nennt?

+
+
+
+

14.10. Frage

+
+

Warum sollten Sie davon Abstand nehmen, `Collection`s selber zu implementieren?

+
+
+
+

14.11. Frage

+
+

Warum ist es oft attraktiv, wenn möglich, eine Schnittstelle statt eine Klasse als Typ einer Variablen anzugeben?

+
+
+
+

14.12. Frage

+
+

Warum ist es bei Collections manchmal sinnvoller, eine Variable mit der implementierenden Klasse statt dem Interface zu deklarieren.

+
+
+
+

14.13. Frage

+
+
+
List<Integer> lst = ...;
+for(int i = 0; i < lst.size(); i++) {
+ if (lst.get(i) < 0) lst.remove(i);
+}
+
+
+
+

Ojemine! Aus welchem Grunde?

+
+
+
+

14.14. Frage

+
+

Herr Kofler benennt fünf statische Methoden der Klasse Collections, die nützlich sind — und oft gebraucht werden.

+
+
+
+

14.15. Frage

+
+

Dem Kopf der for-Schleife fehlt doch was, oder?

+
+
+

for(Iterator<Integer> it = s.iterator(); it.hasNext(); )

+
+
+

Kann so eine for-Schleife überhaupt funktionieren?

+
+
+
+

14.16. Frage

+
+

Listen Sie freisprachlich auf (jeweils ein Verb), welche Fähigkeiten eine Collection mit sich bringt.

+
+
+
+

14.17. Frage

+
+

Was ist der wesentliche Unterschied zwischen einer Liste (List) und einer Menge (Set)?

+
+
+
+

14.18. Frage

+
+

Set definiert add mit dem Rückgabetyp boolean. Warum?

+
+
+
+

14.19. Frage

+
+

In welcher Klasse finden Sie eine Methode um Listen zu sortieren?

+
+
+
+

14.20. Frage

+
+

Die Implementierung HashSet<T> erwartet, das der parametrisierte Typ zwei Methoden "sauber" implementiert hat? Welche sind das?

+
+
+
+

14.21. Frage

+
+

Der Unterschied zwischen einem LinkedHashSet und einem HashSet ist?

+
+
+
+

14.22. Frage

+
+

Was ist ein TreeSet?

+
+
+
+

14.23. Frage

+
+

Set<java.awt.Point> pset = new TreeSet<java.awt.Point>(); Schon verloren. Wie kommt’s?

+
+
+
+

14.24. Frage

+
+

Welchen Wert hat new ArrayList<Integer>(10).size()?

+
+
+
+

14.25. Frage

+
+

Wann sollte man der LinkedList den Vorrang vor ArrayList geben?

+
+
+
+

14.26. Frage

+
+

Was heißt "FIFO", was "LIFO"? (Das sind zwei ganz beliebte Abkürzungen.)

+
+
+
+

14.27. Frage

+
+

Wie sollte man am Besten eine Liste oder ein Set kopieren?

+
+
+
+

14.28. Frage

+
+

Wenn Sie über Schlüssel-Wert-Paare einer Map iterieren wollen (und beides brauchen), können Sie die Methode entrySet verwenden. Der Rückgabetyp dieser Methode ist Set<Map.Entry<K,V>>. Erklären Sie diesen Typ.

+
+
+
+

14.29. Frage

+
+

Ist Map.Entry als static deklariert oder nicht? Woran sieht man das?

+
+
+
+

14.30. Frage

+
+

Die Map-Schnittstelle gehört nicht zu den Collections. Was könnte der Grund dafür sein?

+
+
+
+

14.31. Frage

+
+

Die Map<K,V>-Schnittstelle hat zwei wichtige Methoden put und get. Was vermuten Sie, wie die Methodenköpfe zu den beiden Methoden aussehen?

+
+
+
+

14.32. Frage

+
+
+
class A { int x; A(int x) {this.x = x; } }
+Map<A, Integer> myMap = new HashMap<>();
+myMap.put(new A(1), 1);
+myMap.put(new A(1), 2);
+
+
+
+

Was ergibt myMap.size()?

+
+
+
+

14.33. Frage

+
+

Zur Map<K,V>-Schnittstelle finden Sie boolean containsKey(Object key) deklariert. Komisch? Komisch! Was ist an der Deklaration überraschend?

+
+
+
+

14.34. Frage

+
+

Was unterscheidet eine HashMap von einer LinkedHashMap? Welche der beiden Implementierungen verwenden Sie im Regelfall?

+
+
+
+

14.35. Frage

+
+

Welche Probleme ergeben sich, wenn die Schlüssel einer Map veränderliche Objekte sind?

+
+
+
+

14.36. Frage

+
+

Wenn man über den Inhalt einer Map iterieren möchte gibt es drei Möglichkeiten an ein Objekt zu gelangen das Iterable implementiert. Diese Möglichkeiten entsprechen jeweils einer anderen Sicht auf den Inhalt der Map. Welche sind das?

+
+
+
+

14.37. Frage

+
+

Die Map-Methode put liefert einen Wert zurück. Weshalb ist Sie nicht einfach als void deklariert?

+
+
+
+

14.38. Frage

+
+

Angenommen, Sie haben eine Map namens book vom Typ HashMap<ISBN,Book>. Schreiben Sie den Kopf einer for-Schleife, die über alle ISBNs iteriert.

+
+
+
+
+
+

15. Dateien und Verzeichnisse

+
+
+

Tabelle 15.2, 15.3, 15.4 sind wieder ein Gold-Nuggets.

+
+
+

15.1. Frage

+
+

Handelt es sich bei java.io.IOException um eine geprüfte oder eine ungeprüfte Ausnahme? Weshalb?

+
+
+
+

15.2. Frage

+
+

Welches Konstrukt sollte man verwenden, um Ressourcen nach der Verwendung automatisch zu schließen?

+
+
+
+

15.3. Frage

+
+

Geben Sie zwei Beispiele an, warum die Arbeit mit dem Dateisystem zu Exceptions führen kann.

+
+
+
+

15.4. Frage

+
+
+
try (BufferedReader br = Files.newBufferedReader("test.txt", StandardCharsets.UTF_8)) {
+  // ...
+}
+
+
+
+

Könnte ich nicht nach diesem Block noch einmal br.readLine() aufrufen wollen? Weshalb kann br direkt nach Ende der geschweiften Klammer geschlossen werden?

+
+
+
+

15.5. Frage

+
+

Welches gedankliche Modell liegt einer Ressource zugrunde, so dass man die Arbeit mit ihr per close-Methode abschliesst? (edited)

+
+
+
+

15.6. Frage

+
+

Wofür brauchen Sie die Methode System.getProperty? Nennen Sie Beispiele für Eigenschaften, die Sie mit dieser Methode auslesen können.

+
+
+
+

15.7. Frage

+
+

Was liefert in der JShell jshell> System.getProperty("user.dir") zurück?

+
+
+
+

15.8. Frage

+
+

Sie bekommen einen geheimen Pfad geheim vom Typ Path. Prüfen Sie, ob es sich dabei um ein existierendes Verzeichnis handelt und erstellen Sie dann ein neues Path-Objekt, das auf die Datei test.jar im Unterverzeichnis lib dieses Verzeichnisses verweist.

+
+
+
+

15.9. Frage

+
+

Was ist ein absoluter Pfad?

+
+
+
+

15.10. Frage

+
+

Unter Windows entspricht System.getProperty("user.dir") welcher Umgebungsvariablen (aubrufbar in der Kommandozeile)?

+
+
+
+

15.11. Frage

+
+

Mit welchem Kommando in der Windows-Kommandozeile wechseln Sie das Verzeichnis? Wir schauen Sie sich den Inhalt eines Verzeichnisses an?

+
+
+
+

15.12. Frage

+
+

Sie haben wieder einen geheimen Pfad geheim, der auf eine Datei MyTest.java verweist. Sie wissen nicht, in welchem Verzeichnis sich die Datei befindet, aber sie wissen dass es dort auch eine Datei namens MyOtherTest.java gibt. Nennen Sie zwei Wege, wie sie einen Pfad zu dieser Datei erzeugen können.

+
+
+
+

15.13. Frage

+
+

Was ist eine Datei?

+
+
+
+

15.14. Frage

+
+

Was ist ein Verzeichnis?

+
+
+
+

15.15. Frage

+
+

Wie muss die Signatur der Methode Paths.get aussehen, wenn Sie beliebig viele Strings als Argumente akzeptiert?

+
+
+
+

15.16. Frage

+
+

Was ist ein Link?

+
+
+
+

15.17. Frage

+
+

Wie kopiert und wie verschiebt man eine Datei unter Windows von der Konsole aus?

+
+
+
+

15.18. Frage

+
+

Welche Methode der Klasse Files liefert einen Stream - newDirectoryStream oder list?

+
+
+
+

15.19. Frage

+
+

Schreiben Sie ein Programmfragment, das eine Textdatei zeilenweise einliest.

+
+
+
+

15.20. Frage

+
+

Schreiben Sie ein Programmfragment, das die Einträge eines String-Arrays als einzelne Zeilen in eine Textdatei schreibt.

+
+
+
+

15.21. Frage

+
+

Muss man immer Files.createFile zum Anlegen einer neuen Datei verwenden, oder geht das auch einfacher?

+
+
+
+

15.22. Frage

+
+

Was bedeuten die Zahlen in UTF-8, UTF-16 und UTF-32

+
+
+
+

15.23. Frage

+
+

Muss man immer Files.createDirectory bzw. Files.createDirectories aufrufen um ein neues Verzeichnis zu erstellen, oder geht das auch einfacher?

+
+
+
+
+
+

16. JavaFX

+
+ +
+
+
+

17. Javadoc

+
+ +
+
+
+

18. Pakete und Bibliotheken

+
+
+

18.1. Frage

+
+

Ist es möglich, umfangreiche Java-Programme ohne eine einzige import-Anweisung zu schreiben?

+
+
+
+

18.2. Frage

+
+
+
import java.util.Arrays.sort;
+int[] a = {4,1,3};
+sort(a);
+
+
+
+

Fügen Sie ein Schlüsselwort an der richtigen Stelle ein, damit der Code funktioniert.

+
+
+
+

18.3. Frage

+
+

Eine import-Anweisung muss immer wo stehen?

+
+
+
+

18.4. Frage

+
+

In den Fragen zu vorherigen Kapiteln haben wir immer java.awt.Point als Typ verwendet statt Point. Weshalb haben wir das gemacht und was muss man tun, um einfach direkt Point schreiben zu können?

+
+
+
+

18.5. Frage

+
+

Was kann man mit import importieren?

+
+
+
+

18.6. Frage

+
+

Was kann man mit import static importieren?

+
+
+
+

18.7. Frage

+
+

Warum ist import ein irreführender Name? Tatsächlich organisiert man über import nur ___räume!

+
+
+
+

18.8. Frage

+
+
+
import java.awt.Point;
+class Point { int x,y,z; }
+Point p = new Point();
+
+
+
+

Problem?

+
+
+
+

18.9. Frage

+
+
+
import java.awt.*;
+Point p;
+
+
+
+

Geht das gut?

+
+
+
+

18.10. Frage

+
+

Was ist der Unterschied von import de.thm.mni; und import de.thm.mni.*;?

+
+
+
+

18.11. Frage

+
+

Welches Paket ist standardmäßig in Java SE importiert?

+
+
+
+

18.12. Frage

+
+

import static java.awt.Color.* Jetzt darf ich Color c = new Color(0,0,0); deklarieren, richtig?

+
+
+
+

18.13. Frage

+
+

Wozu braucht man auf S.372 oben am Anfang die Codezeile import java.awt.Color; wenn unten darunter import static java.awt.Color.*; steht?

+
+
+
+

18.14. Frage

+
+

Was muss man tun, damit man die Methoden der Klasse Math direkt ohne den Anteil Math. in seinem Code verwenden kann?

+
+
+
+

18.15. Frage

+
+

Kann ich die Klasse java.awt.Color und eine Klasse de.thm.mni.Color zusammen im gleichen Stück Code verwenden?

+
+
+
+

18.16. Frage

+
+

Man kann import static java.lang.System.out; schreiben. Dann geht doch auch import static java.lang.System.out.println;, oder?

+
+
+
+

18.17. Frage

+
+

Was ist der Unterschied von import de.thm.mni.OOP; zu import static de.thm.mni.OOP;

+
+
+
+

18.18. Frage

+
+

Sie schreiben ein Programm im Fachbereich MNI der THM im Kurs OOP. Sie definieren ein Paket für Ihr Programm. Wie sollte der Paketname anfangen?

+
+
+
+

18.19. Frage

+
+

Die Option -cp bei java bzw. javac steht für welches Java-Konzept?

+
+
+
+

18.20. Frage

+
+

Welche Argumente müssen sie an java übergeben, wenn sie eine eigene Klasse main.Main ausführen wollen, die das Paket somePackage.jar verwendet? In welchen Ordnern sucht die JVM dabei nach der .class-Datei von main.Main und der Datei somePackage.jar?

+
+
+
+
+
+
+
+ + + \ No newline at end of file