Wo ist das new
zur Instanziierung geblieben? String s = "abc";
-
❏ Man kann auch schreiben
String s = new "abc";
-
❏ Man kann auch schreiben
String s = new("abc");
-
✓ Man kann auch schreiben
String s = new String("abc");
-
✓ Ein
new
ist gar nicht notwendig.
Der Ausdruck "abc"
ist ein Zeichenketten-Literal. Literale erzeugen direkt eine Instanz ihres Typs, hier eine Instanz einer Zeichenkette. Literale werden ohne den new
-Operator verwendet.
Es ist auch legitim new String("abc")
zu schreiben, was aber doppelte Arbeit leistet: die String-Instanz des Literals ist Argument im String-Konstruktor, der seinerseits eine neue, wertgleiche String-Instanz erzeugt.
Wie unterscheidet sich ein Javadoc-Kommentar von normalen Kommentaren?
Ein Javadoc-Kommentar beginnt mit /**
und endet mit */
. "Normale" Kommentare sind entweder einzeilig (//
) oder mehrzeilig (von /*
bis */
). Javadoc-Kommentare werden vom dem Tool javadoc
bei der Generierung der Dokumentation eines Programms mit berücksichtigt.
Wie sieht ein Javadoc-Kommentar mit seinem öffnenden und schließenden Kommentarteil aus?
-
❏
/*
und*/
-
✓
/**
und*/
-
❏
/**
und/*
-
❏
/*
und**/
Was ist ein Schlüsselwort?
-
❏ Unsinn, es gibt in Java so etwas wie ein Schlüsselwort nicht
-
✓ Ein Schlüsselwort ist ein reservierter Bezeichner
-
❏ Als Schlüsselwort bezeichnet man in einer
Map<K,V>
einen Wert vom TypK
(für Key) -
❏ Bezeichner in Großbuchstaben (wie
HALT
) heißen Schlüsselwörter
Ein Schlüsselwort ist ein reservierter Bezeichner für Programmkonstrukte (wie z.B. if
, for
und class
), der als Name für Variablen, Klassen etc. nicht gewählt werden darf.
Never use Dollars in Javaland. Why? — Die Frage meint: Warum sollen keine $
-Zeichen in Bezeichnern für Variablen, Klassen, Methoden, Schnittstellen etc. verwendet werden?
-
❏ Das
$
-Zeichen ist in Bezeichnern nicht erlaubt -
❏ Das
$
-Zeichen ist für einen internen Variablenbezeichner reserviert -
✓ Das
$
-Zeichen ist Code-Generatoren vorbehalten -
❏ Das
$
-Zeichen ist ein Schlüsselwort
Man überlässt den Gebrauch des $
-Zeichens Code-Generatoren, so dass es keinen Konflikt mit den von Menschen gewählten Bezeichnern geben kann.
for(int i = 0; i <= 10; i++);
. Wo ist das Problem?
-
❏ Es muss
int i = 1
heißen -
❏ Statt des Strichpunkts müssen gescheifte Klammern
{ }
folgen -
❏ Im
for
-Kopf müssen die Strichpunkte durch Kommas ersetzt werden -
✓ Ohne etwas vor dem Semikolon ist die
for
-Schleife sinnlos
Die Schleife bleibt ohne Auswirkungen (außer, dass sie Zeit für die Durchläufe verbraucht), da dem for
-Kopf eine leere Anweisung (das Semikolon) folgt.
Kann man den “`"-Operator bei Zeichenketten anwenden? Falls ja, was bedeutet "`” bei Zeichenketten?
-
❏ Addition der Strings
-
❏ Addition der durch die Strings repräsentierten Zahlen
-
✓ Verkettung der Strings
-
❏ Man kann Strings nicht addieren.
Man nennt die Verkettung auch Konkatenation.
Kann man den “-”-Operator bei Zeichenketten anwenden? Falls ja, was bedeutet “-” bei Zeichenketten?
-
❏ Subtraktion der Strings
-
❏ Subtraktion der durch die Strings repräsentierten Zahlen
-
❏ Entkettung der Strings
-
✓ Man kann Strings nicht subtrahieren.
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?)
Wenn x
zuvor als int
deklariert ist, welchen Wert würde der Ausdruck x == 0
direkt nach dem gezeigten Codeabschnitt ergeben?
-
✓
true
, sofernx < 0
eintrue
ergeben hätte -
✓
true
, sofernx < 0
einfalse
ergeben hätte -
❏
false
, sofernx < 0
eintrue
ergeben hätte -
❏
false
, sofernx < 0
einfalse
ergeben hätte
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.
Warum kann man die Klasse Math
verwenden, ohne sie vorher zu importieren?
-
✓ Weil sie als Teil von
java.lang
standardmäßig importiert wird -
❏ Weil das eben so ist; eine Entscheidung der Schöpfer von Java
-
❏ Das ist ausschließlich eine Besonderheit der JShell
-
❏ Das stimmt nicht, man muss
Math
explizit importieren
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?
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.
import a.packet.*;
Was meint der Stern *
in der import
-Anweisung?
-
❏ Importiere die Typen in
a.packet
und die in den Unterpaketen -
❏ Importiere nur die Klassen in
a.packet
-
✓ Importiere die Typen in
a.packet
-
❏ Importieren die Klassen in
a.packet
und die in den Unterpaketen
Der Stern importiert alle Typen (Klassen, Schnittstellen, Enumerationen) des angegebenen Pakets.
DateTimeFormatter.ofPattern("EEEE, d. MMMM yyyy");
Was meint diese Codezeile?
Die Methode ofPattern
erzeugt ein DateTimeFormatter
-Objekt. Die Zeichenkette "EEEE, d. MMMM yyyy"
beschreibt, wie Datum und Uhrzeit formatiert werden sollen. EEEE
steht für den vollständigen Wochentag, d
für den Tag im Monat (1-31) usw. Kapitel 7 beschreibt den DateTimeFormatter
ausführlicher. Das Verständnis für die Funktionsweise des DateTimeFormatter
ist an dieser Stelle nicht wichtig. Gut wäre aber, wenn Sie die Funktionsweise von import
verstehen.
Warum kann man keine Instanz der Klasse Math
erzeugen?
-
❏ Weil
Math
keinen Konstruktor hat -
✓ Weil der Konstruktor von
Math
privat ist -
❏ Weil
Math
eine statische Klasse ist -
❏ Weil die Klasse
Math
abstrakt ist
Der Konstruktor von Math
ist nicht public
, und damit ist keine Instanz von Math
erzeugbar. Von einer als abstract
ausgewiesenen Klasse ist zwar ebenfalls keine Instanz erzeugbar, das trifft auf Math
allerdings nicht zu.
jshell> static class A {}
| Warning:
| Modifier 'static' not permitted in top-level declarations, ignored
| static class A {}
| ^----^
| replaced class A
jshell> class A { static class B { } }
| modified class A
jshell> new A.B()
$21 ==> A$B@55d56113
jshell> abstract class A {}
| created class A
jshell> new A()
| Error:
| A is abstract; cannot be instantiated
| new A()
| ^-----^
jshell> class B { private B() {} }
| created class B
jshell> new B()
| Error:
| B() has private access in B
| new B()
| ^-----^
jshell> new Math()
| Error:
| Math() has private access in java.lang.Math
| new Math()
| ^--------^