Skip to content

Latest commit

 

History

History
303 lines (238 loc) · 9.72 KB

Kap.1.8.adoc

File metadata and controls

303 lines (238 loc) · 9.72 KB

Zeichenkette und new

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.

Antwort

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.

Javadoc-Kommentar vs. "normaler" Kommentar

Wie unterscheidet sich ein Javadoc-Kommentar von normalen Kommentaren?

Antwort

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.

Aussehen eines Javadoc-Kommentars

Wie sieht ein Javadoc-Kommentar mit seinem öffnenden und schließenden Kommentarteil aus?

  • /* und */

  • /** und */

  • /** und /*

  • /* und **/

Was ist ein Schlüsselwort?

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 Typ K (für Key)

  • ❏ Bezeichner in Großbuchstaben (wie HALT) heißen Schlüsselwörter

Antwort

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

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

Antwort

Man überlässt den Gebrauch des $-Zeichens Code-Generatoren, so dass es keinen Konflikt mit den von Menschen gewählten Bezeichnern geben kann.

for-Problem?

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

Antwort

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.

Das Semikolon

Das Semikolon ; beendet

  • ❏ eine Datei

  • ❏ einen Ausdruck

  • ❏ eine Ausgabe

  • ✓ eine Anweisung

Ein Plus fur Zeichenketten?

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.

Antwort

Man nennt die Verkettung auch Konkatenation.

Ein Minus für Zeichenketten?

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.

Das Semikolon und if

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, sofern x < 0 ein true ergeben hätte

  • true, sofern x < 0 ein false ergeben hätte

  • false, sofern x < 0 ein true ergeben hätte

  • false, sofern x < 0 ein false ergeben hätte

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.

Import von Math

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

Eigenschaften

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.

import mit Stern

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

Antwort

Der Stern importiert alle Typen (Klassen, Schnittstellen, Enumerationen) des angegebenen Pakets.

Ein Datumspattern

DateTimeFormatter.ofPattern("EEEE, d. MMMM yyyy"); Was meint diese Codezeile?

Antwort

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.

Math-Instanz?

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

Antwort

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.

Durchspielen der Fälle an der JShell
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()
|  ^--------^