Wichtige Datentypen
| Typ | Beispiel | Wofür |
|---|
| int (Java 32-bit) / int (Python beliebig groß) | 42 | Ganze Zahlen |
| double (Java-Standard, 64-bit) | 3.14 | Kommazahlen, Standardwahl |
| float (Java 32-bit, weniger genau) | 3.14f | Kommazahlen, sparsamer |
| String / str | "Hallo" | Text |
| boolean / bool | true / false / True / False | Wahrheitswerte |
Weitere Java-Primitive: byte (8-bit), short (16-bit), long (64-bit, Literal mit L-Suffix), char (16-bit UTF-16).
Faustregel zur Typ-Wahl: Für ganze Zahlen nutze fast immer int. Nur bei extrem großen Zahlen (über 2 Mrd.) wähle long. byte und short sind Spezialkandidaten für hardware-nahe oder speicher-kritische Situationen (Embedded-Systeme, große Datenmengen mit fester Bit-Breite), kommen in Standard-BWL/Info-Klausuren selten vor. char brauchst du nur wenn du wirklich genau ein Zeichen meinst, sonst lieber String.
Konvertierungen: Widening vs Narrowing
WIDENING (implizit erlaubt, KEINE Compile-Errors):
byte → short → int → long → float → double
(1) (2) (3)
(1) auch char → int direkt erlaubt
(2) int → float: Präzisionsverlust möglich (float-Mantisse 24 Bit
effektiv, int hat 32 Bit Nutzdaten). int → double ist dagegen
VERLUSTFREI (double-Mantisse 53 Bit effektiv reicht für jeden int).
(3) long → float und long → double: Präzisionsverlust möglich
(long hat 64 Bit, double-Mantisse nur 53 Bit effektiv)
NARROWING (expliziter Cast nötig, Datenverlust möglich):
double → float → long → int → short → byte
Beispiel: int x = (int) 3.7; // Ergebnis: 3 (Truncation, kein Runden)
Welche Widening-Konvertierungen sind verlustfrei, welche nicht?
| Konvertierung | Verlustfrei? | Grund |
|---|
byte → int | ✅ ja | int (32 Bit) deckt byte-Wertebereich komplett ab |
int → long | ✅ ja | long (64 Bit) deckt int komplett ab |
int → double | ✅ ja | double-Mantisse (53 Bit effektiv) reicht für jeden int |
float → double | ✅ ja | double ist eine Obermenge von float |
int → float | ⚠️ kann verlieren | float-Mantisse (24 Bit effektiv) zu klein für große int |
long → float | ⚠️ kann verlieren | gleiche Logik, noch dramatischer |
|
Java erlaubt diese Konvertierungen alle implizit OHNE Cast (kein Compile-Error), aber bei den ⚠️-Fällen bekommst du eine gerundete Approximation statt des exakten Werts. Hinweis zur Mantisse: IEEE-754 nutzt einen impliziten führenden 1-Bit, also 23 gespeicherte + 1 implizit = 24 effektive Mantissen-Bits bei float bzw. 52 + 1 = 53 bei double.
Normale Variablen können neu zugewiesen werden. Ausnahmen:
- Java
final: final int x = 5;, x kann nicht neu zugewiesen werden.
- Mutability vs. Reassignment: Auch ohne
final muss man unterscheiden zwischen "den Namen auf ein anderes Objekt zeigen lassen" (Reassignment) und "das Objekt selbst verändern" (Mutation). In Python sind int, str, tuple z. B. unveränderlich (immutable), aber der Name kann an ein neues Objekt gebunden werden.
In statisch typisierten Sprachen wie Java bleibt der Typ einer Variable fest: aus einem int wird kein String. In dynamisch typisierten Sprachen wie Python kannst du denselben Namen später für einen anderen Typ wiederverwenden, was Flexibilität gibt, aber auch Fehlerquellen.