Menu

Java-Datentypen: Primitive, Referenztypen und Standardwerte

Javas Datentypen erklärt: die acht primitiven Typen, Referenztypen, Standardwerte, Literale und Suffixe, Überlauf und wann man welchen numerischen Typ verwendet.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Zwei Familien: Primitive und Referenzen

Jeder Wert in Java hat einen Typ, und dieser Typ gehört zu einer von zwei Familien. Primitive Typen speichern einen rohen Wert direkt: eine Zahl, ein einzelnes Zeichen oder ein Wahr/Falsch. Referenztypen speichern eine Referenz (einen Zeiger) auf ein Objekt, das anderswo im Speicher liegt: String, Arrays und jede Klasse, die du oder die Bibliotheken definierst.

Diese Unterscheidung ist wichtig, weil Primitive leichtgewichtig sind und als Wert kopiert werden, während Referenzvariablen auf gemeinsam genutzte Objekte zeigen. Beginne mit den acht Primitiven - sie sind das Fundament, auf dem alles andere aufbaut.

Die acht primitiven Typen

Java hat genau acht eingebaute primitive Typen. Sechs sind Zahlen, einer ist ein Zeichen, einer ist ein Boolean:

Ein paar Dinge, die von Anfang an auffallen sollten: Die Unterstriche in 2_000_000 sind nur optische Trennzeichen, die der Compiler ignoriert, die Suffixe L und f sind erforderlich (mehr dazu unten), und char verwendet einfache Anführungszeichen, während ein String doppelte Anführungszeichen verwenden würde.

Einen numerischen Typ wählen

byte oder short brauchst du fast nie - sie sparen nur in riesigen Arrays Speicher. Die echten Entscheidungen fallen zwischen int/long für ganze Zahlen und float/double für Dezimalzahlen.

TypGrößeVerwenden, wenn
int32 BitDer Standard für ganze Zahlen (bis ~2,1 Milliarden)
long64 BitWerte über ~2 Milliarden: Millisekunden-Zeitstempel, Dateigrößen
double64 BitDer Standard für Dezimalzahlen - gute Genauigkeit
float32 BitNur wenn der Speicher knapp ist und die Genauigkeit leiden darf

Die Falle ist der Überlauf. Ein int läuft still über, wenn er seinen Bereich überschreitet - kein Fehler, nur eine falsche Antwort:

maxInt + 1 läuft zu -2147483648 über, weil beide Operanden int sind und das Ergebnis ein int bleibt. Wenn man eine Seite zuerst nach long castet, wird die Berechnung in 64 Bit durchgeführt. Wenn ein Wert groß sein könnte - besonders Millisekunden seit 1970 - greife zu long.

Literale und ihre Suffixe

Ein nacktes Zahlenliteral hat einen Standardtyp, und das beißt einen. 100 ist ein int; 3.14 ist ein double. Um ein long- oder float-Literal zu schreiben, musst du ein Suffix hinzufügen:

Lass das L bei 8_000_000_000L weg, und der Code kompiliert nicht, weil das Literal den int-Bereich überschreitet, bevor es überhaupt die long-Variable erreicht. Lass das f bei 0.5f weg, und Java beschwert sich, dass ein double ohne Cast nicht einem float zugewiesen werden kann. Das Suffix ist nicht groß-/kleinschreibungsabhängig, aber verwende ein großes L - ein kleines l sieht genau wie die Ziffer 1 aus.

char ist eine getarnte Zahl

Ein char speichert eine 16-Bit-Unicode-Codeeinheit, was bedeutet, dass er zugleich als kleine vorzeichenlose Ganzzahl fungiert. Du kannst damit rechnen und ihn per Cast hin und her umwandeln:

Das ist gelegentlich praktisch, um Buchstaben zu verschieben, aber verlass dich dabei nicht auf Text - dafür ist String da. Beachte, dass char einfache Anführungszeichen verwendet ('A'); doppelte Anführungszeichen ("A") erzeugen einen einzeichigen String, was ein völlig anderer Typ ist.

Standardwerte (und die Falle der lokalen Variablen)

Felder und Array-Elemente, die du nicht initialisierst, erhalten einen sinnvollen Standardwert. Aber das gilt nur für Felder und Array-Plätze: lokale Variablen erhalten keinen Standardwert, und eine zu verwenden, bevor man ihr einen Wert zuweist, ist ein Kompilierfehler, keine Überraschung zur Laufzeit.

Würdest du stattdessen int x; System.out.println(x); innerhalb von main schreiben, würde der Compiler es mit „variable x might not have been initialized" ablehnen. Diese Strenge ist ein Vorteil - sie hindert dich daran, Müll zu lesen. Die Standardwerte, die man sich merken sollte: numerische Typen 0, boolean false, char ' ' und jeder Referenztyp null.

Weiter: Strings

String ist der Referenztyp, mit dem du am häufigsten zu tun haben wirst: Text, zusammengefügte Werte, Benutzereingaben. Er verhält sich anders als die hier gezeigten Primitiven: Er ist ein Objekt, er ist unveränderlich (immutable), und das Vergleichen von Strings hat seine eigenen Tücken. Die nächste Seite behandelt ihn.

Häufig gestellte Fragen

Wie viele Datentypen gibt es in Java?

Java hat acht primitive Typen: byte, short, int, long, float, double, char und boolean. Alles andere - String, Arrays und jedes Objekt - ist ein Referenztyp. Die Anzahl der eingebauten Primitiven ist also fest bei acht, während Referenztypen unbegrenzt sind, weil du (und die Bibliotheken) neue Klassen definierst.

Was ist der Unterschied zwischen int und long in Java?

Beide speichern ganze Zahlen, aber int ist 32 Bit (Bereich etwa ±2,1 Milliarden) und long ist 64 Bit (Bereich etwa ±9,2 Trillionen). Verwende standardmäßig int; wechsle zu long, wenn ein Wert zwei Milliarden überschreiten kann - Zeitstempel in Millisekunden, Dateigrößen, große Zähler. Ein long-Literal braucht das Suffix L, z. B. long big = 10000000000L;.

Was ist der Standardwert eines int in Java?

Ein int-Feld hat standardmäßig den Wert 0 - aber nur Felder und Array-Elemente erhalten Standardwerte. Ein long hat 0L, ein double 0.0, ein boolean false, ein char '\u0000' und jeder Referenztyp null. Lokale Variablen erhalten überhaupt keinen Standardwert - du musst ihnen vor der Verwendung einen zuweisen, sonst kompiliert der Code nicht.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S