Sind folgende Java-Anweisungen fehlerfrei zu compilieren und auszuführen? Begründen Sie Ihre Antwort.
int a;a = 5;
int b = 5;
int c,c = 5;
float d = 5,5;
float e = 5;
double f1 = 5d; float f2 = f1;
double g1 = 5e; float g2 = g1;
double h1 = 5f; float h2 = h1;
long i = 0.0;
float j = 0.0;
float k1 = 5f; double k2 = k1;
double l = 0.0;
long m = (short)Integer.MAX_VALUE;
short n = (long)0;
zu den Teilaufgaben:
a
als auch 5
vom Typ int
sind: int a;
a = 5;
b
als auch 5
sind vom Typ int
.c
deklariert wird: int c;
int c = 5;
5,5
ist kein numerischer Wert und kann folglich nicht zugewiesen werden -- d
hat den Typ float
, einen Kommazahlentyp. Kommazahlen in Java haben immer einen Dezimalpunkt.5
ist zwar vom Typ int
, aber die Zuweisung eines Ganzzahl-Werts zu einer Kommazahl-Variable ist logischerweise möglich. Es kommt dann zu einer impliziten Konvertierung (Type-Cast); man sagt umgangssprachlich, die Typen float
und int
seien in diesem Zusammenhang zuweisungskompatibel (gilt aber nicht umgekehrt!).5d
die Zahl 5
als Wert vom Typ double
völlig korrekt. Dann aber wird ein double
-Wert in Form der Variablen f1
der float
-Variablen f2
zugewiesen. Weil double
doppelt so viele Stellen hat wie float
, verbietet der Compiler diese Zuweisung. (Mit einem expliziten Type-Cast wäre es möglich, sie zu erzwingen.)5e
ist kein Wert; die nachgestellten Kürzel gibt es nur für die Typen float
(f
), double
(d
) und long
(L
).float
-Wert steht, ändert nichts daran, dass h1
vom Typ double
ist. Es findet eine transparente Typumwandlung statt, genau wie bei Teilaufgabe (e).0.0
hat den Typ double
. Kommazahlen-Werte können nicht Ganzahl-Variablen zugewiesen werden, außer, man macht einen expliziten Type-Cast. Teilaufgabe (e) demonstriert den umgekehrten Fall (allerdings mit float
und int
).0.0
hat den Typ double
, benötigt wird aber float
.float
hat weniger Stellen als double
, daher ist die Zuweisung kein Problem. Die zusätzlichen Stellen in double
werden quasi einfach mit Nullen aufgefüllt. Vergleiche Teilaufgabe (f).l
ist vom Typ double
, 0.0
ebenfalls.Integer.MAX_VALUE
hat den Wert 2147483647
(natürlich vom Typ int
). Mit einem expliziten Type-Cast wie hier gezeigt ist es möglich, diesen Wert in den Typ short
„hineinzupressen,“ obwohl der viel weniger Stellen hat. Alles, was nicht reinpasst, fällt dann einfach weg. Und den dann rechts resultierenden Wert vom Typ short
kann man natürlich einer long
-Variablen zuweisen; die zusätzlichen Stellen in long
werden dann einfach mit Nullen gefüllt. (m
hat übrigens hinterher den Wert-1
wegen der internen Darstellungsform negativer Zahlen. Wie man sieht, warnt der Compiler nicht ohne Grund vor „possible loss of precision.“)int
, der dann noch explizit in long
gecastet wird (also noch mehr Stellen bekommt). Der Typ short
hat aber weniger Stellen als jeder der beiden, so dass eine Zuweisung nur mit explizitem Type-Cast zu short
möglich wäre.Anmerkung. Bei Problemen dieser Art ist das „Code Pad“ in BlueJ äußerst hilfreich. Siehe Unterlagen.
Arne Johannessen, 2. Dezember 2007