Java Standard: Primitive Datentypen
Worum geht es?
Variablen sind Speicherorte für Daten wie Zahlen, Texte oder Adressen. Java ist eine statisch typisierte Programmiersprache. Das bedeutet, dass zu dem Zeitpunkt, wo das Java-Programm erstellt wird bekannt sein muss, welchen Typ eine Variable hat. Typen können so genannte primitive Datentypen sein oder beliebig komplexe Klassen.
Was sind Primitive Datentypen?
Primitive Datentypen sind eine Gruppe von Typen, mit denen man Variablen erstellen kann, die Zahlen, einzelne Zeichen oder logische Werte aufnehmen. Für jeden primitiven Datentyp gibt es zudem eine eigene, so genannte Wrapperklasse, die diesen Datentyp aufnimmt. Nachdem wir die einzelnen primitiven Datentypen besprochen haben, besprechen wir die zugehörigen Wrapperklassen und zeigen Vor- und Nachteile auf.
Die primitiven Datentypen, ihr typischer Wertebereich und die zugehörige Wrapperklasse haben wir in der folgenden Tabelle für Sie aufgeführt.
Typname | Größe[1] | Wrapper-Klasse | Wertebereich | Beschreibung |
---|---|---|---|---|
boolean | undefiniert[2] | java.lang.Boolean | true / false | Boolescher Wahrheitswert, Boolescher Typ[3] |
char | 16 bit | java.lang.Character | 0 ... 65.535 (z. B. 'A') | Unicode-Zeichen (UTF-16) |
byte | 8 bit | java.lang.Byte | -128 ... 127 | Zweierkomplement-Wert |
short | 16 bit | java.lang.Short | -32.768 ... 32.767 | Zweierkomplement-Wert |
int | 32 bit | java.lang.Integer | -2.147.483.648 ... 2.147.483.647 | Zweierkomplement-Wert |
long | 64 bit | java.lang.Long | -263 bis 263-1, ab Java 8 auch 0 bis 264 -1[4] | Zweierkomplement-Wert |
float | 32 bit | java.lang.Float | +/-1,4E-45 ... +/-3,4E+38 | 32-bit IEEE 754, es wird empfohlen, diesen Wert nicht für Programme zu verwenden, die sehr genau rechnen müssen. |
double | 64 bit | java.lang.Double | +/-4,9E-324 ... +/-1,7E+308 | 64-bit IEEE 754, doppelte Genauigkeit |
- ↑ Mindestgröße, soweit bekannt
- ↑ https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
- ↑ Wir gebrauchen zur zeit in diesem Buch die Begriffe "Boolescher Typ" und "Wahrheitswert" synonym, wünschen uns aber eine Vereinheitlichung in Richtung "Boolescher Typ" oder "Boolesche Variable, wenn Variablen dieses Typs gemeint sind.
- ↑ https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
Wir zeigen ihnen nun den Umgang mit den einzelnen Typen jeweils an einem Beispiel.
Zeichen
Der Datentyp char
kann jedes beliebige Unicode-Zeichen aufnehmen, insbesondere europäische und asiatische Zeichen sind damit abgedeckt. Hierfür benötigt er 2 Bytes an Speicherplatz pro Zeichen. Zeichen werden in Hochkommata eingeschlossen.
char ersterBuchstabe = 'A';
System.out.println("Der erste Buchstabe des Alphabets ist ein");
System.out.println(ersterBuchstabe);
Es spielt für Java keine Rolle, ob Sie eine char
-Variablen ein Zeichen oder eine Zahl zuweisen. Ferner können Sie mit Zeichen auch rechnen:
public class ZeichenTest {
public static void main(String[] args) {
char buchstabe1 = 'A';
char buchstabe2 = 65;
buchstabe1 += 1;
System.out.println(buchstabe1);
System.out.println(buchstabe2);
}
}
Dieses Programm erzeugt die Ausgabe "B A". Addiert man zu einem Zeichen eine 1, dann ist damit das nächste Zeichen gemeint. Ebenso können Sie Zeichen auch numerisch eingeben, wie buchstabe2 = 65
zeigt. 65 ist der Zahlenwert für das Zeichen 'A'.
Ganze Zahlen
byte
Ein byte
ist der kleinste numerische Datentyp in Java, er ist 8 bit lang. Dieser Datentyp tritt zumeist im Zusammenhang mit Feldern auf, auf die wir in einem späteren Kapitel zu sprechen kommen.
byte einByte = 10;
byte anderesByte = -10;
System.out.println(einByte + " " + anderesByte);
Obenstehendes Beispiel zeigt, wie man Variablen vom Typ byte
deklariert und initialisiert.
short
Der Datentyp short
ist 2 Bytes groß und vorzeichenbehaftet. Oft werden Konstanten mit diesem Datentyp angelegt, tatsächlich aber wird short
nur selten wirklich gebraucht.
int
Der Datentyp int
ist wohl der am häufigsten eingesetzte primitive Typ. Er belegt 4 Bytes, was in der Regel für viele Anwendungsbereiche ausreicht.
int a = 1;
int b = 1;
int c = a + b;
System.out.println("a mit dem Wert " + a + " plus B mit dem Wert " + b + " ergibt: C " + c);
long
der Datentyp long
ist die erweiterte Form des int
-Typs. Im Gegensatz zum int
hat dieser Datentyp 8 Bytes. Wenn man bei der Darstellung von Zahlenliteralen Wert darauf legen möchte, dass sie zum Datentyp long
gehören, dann fügt man den Suffix "L" oder "l" (kleines L) an. Das muss man aber nicht, der Compiler wandelt Literale entsprechen um.
Ein Beispiel:
long a = 10L;
long b = 20;
long c = a + b;
System.out.println(a + " + " + b + " = " + c);
Die Ausgabe ist 10 + 20 = 30.
Gleitkommatypen
Mit den Datentypen float
und double
können Sie eine Teilmenge der rationalen Zahlen darstellen. Sprachlich sind Gleitkomma- und Fließkommazahlen gebräuchlich. Beide Typen unterscheiden sich durch ihre Genauigkeit und den Speicherverbrauch. Gemeinsam ist, dass solche Zahlen nur ungefähr richtig gespeichert werden.
float
Eine Variable vom Typ float
speichert eine Gleitkommazahl mit einer Größe von 4 Byte. Die Genauigkeit liegt bei 7 signifikanten Stellen, man spricht hier von einfacher Genauigkeit (engl: single precision). Zahlenliteralen stellt man ein "f" oder "F" nach, sonst nimmt der Java-Compiler an, es handele sich um double
-Literale.
Ein Beispiel:
float a = 1.00f;
float b = 3.00f;
float c = a/b;
float d = c * b; // sollte a ergeben
System.out.println(a + "/" + b + " = " + c);
System.out.println(c + "*" + b + " = " + d + " ( " + a + ")");
Ausgabe:
1.0/3.0 = 0.33333334
0.33333334*3.0 = 1.0 ( 1.0)
Dieses Beispiel zeigt gleichzeitig ein Problem mit Gleitkommazahlen, da hier (1/3) in der ersten Zeile falsch dargestellt wird, die Gesamtrechnung ist aber offenbar richtig.
Verwenden Sie den Datentyp float
nur, wenn es ihnen nicht auf Präzision ankommt.
double
Der Typ double
bietet Gleitkommavariablen mit einer Größe von 8 Byte. Die Genauigkeit liegt bei 15 signifikanten Stellen, dies bezeichnet man als doppelte Genauigkeit (engl. double precision).
double a = 1.00;
double b = 3.00;
double c = a/b;
double d = c * b; // sollte a ergeben
System.out.println(a + "/" + b + " = " + c);
System.out.println(c + "*" + b + " = " + d + " ( " + a + ")");
Ausgabe:
1.0/3.0 = 0.3333333333333333
0.3333333333333333*3.0 = 1.0 ( 1.0)
Boolescher Typ
Eine boolesche Variable boolean
kann einen von zwei Zuständen annehmen: true
oder false
. Dies repräsentiert in Ausdrücken zumeist eine Bedingung ist erfüllt – oder eben nicht.
Boolsche Variablen werden zumeist im Zusammenhang mit Verzweigungen gebraucht, auf die wir im Kapitel über Kontrollstrukturen zu sprechen kommen.
boolean istWahr = true;
if (istWahr) {
// Mach irgendwas
}
Casting in Java
Casting nennt man die Überführung eines Datentypen in einen Anderen. Es gibt implizites und explizites Casting. Ist die Wertemenge eines numerische Datentyps Teilmenge eines anderen Datentyps, dann lässt sich der erste Datentyp in den Zweiten überführen. Hierfür braucht man nichts weiter zu tun, man spricht vom impliziten Casting. Ist aber der Wertebereich eines Datentyps eine echte Obermenge eines anderen, dann kann es zu Datenverlusten führen, den ersten Datentyp in den Zweiten zu überführen. Beispielsweise kann man byte
nach int
überführen, umgekehrt aber nur explizit, das heißt, man schreibt explizit hin, dass man diese Umwandlung wünscht und akzeptiert, dass es zu Datenverlust kommen kann.
int ii = 42;
byte bb = 100;
// implizites Casting ("automatisches Casting") weil int den größeren Wertebereich hat
ii = bb;
// explizites Casting weil der Wertebereich von int eine echte Obermenge von byte ist
bb = (byte) ii;