In Java – ähnlich wie in C, C++ oder C# – besitzt jede Variable einen Datentyp, der festlegt, welche Art von Wert gespeichert werden kann. Bevor eine Variable verwendet wird, muss sie deklariert werden, also mit einem Typ und einem Namen bekannt gemacht werden.
Java stellt eine Reihe von eingebauten, sogenannten primitiven Datentypen bereit. Diese sind besonders effizient und decken die grundlegenden Wertebereiche ab:
- int – Ganzzahl (32 Bit, positiv oder negativ)
- long – Ganzzahl mit doppelter int-Größe (64 Bit)
- short – Ganzzahl mit halber int-Größe (16 Bit)
- byte – Ganzzahl mit 8 Bit
- float – Fließkommazahl nach IEEE-Standard (32 Bit: 1 Bit Vorzeichen, 8 Bit Exponent, 23 Bit Mantisse)
- double – Fließkommazahl mit doppelter float-Größe (64 Bit)
- char – Einzelnes Zeichen wie 'a', ' ', '$' oder '%' (16 Bit, Unicode)
- boolean – Wahrheitswert (true oder false)
💡Beachte: das zusammenfassen von mehreren Variablen in Arrays wird in einem anderen Artikel erklärt.
Numerische Datentypen
In Java gibt es verschiedene numerische Datentypen, die sich in der Größe des reservierten Speichers und im darstellbaren Zahlenbereich unterscheiden. Sie existieren, um Speicher effizient zu nutzen und je nach Anwendungsfall die passende Genauigkeit und Reichweite zu bieten.
byte
Speichergröße: 8 Bit = 1 Byte
Wertebereich: −128 bis +127
Verwendung:
- Ideal für kleine Ganzzahlen, z. Zähler, Flags oder Datenströme.
- Wird oft in Arrays verwendet, um Speicher zu sparen (z. B. bei großen Datenmengen oder binären Dateien).
Warum existiert dieser Typ?
- Um Speicher zu optimieren, wenn nur sehr kleine Werte benötigt werden.
short
Speichergröße: 16 Bit = 2 Byte
Wertebereich: −32 768 bis +32 767
Verwendung:
- Für Ganzzahlen, die größer als byte, aber kleiner als int sind.
- Wird heute seltener genutzt, da Speicherplatz weniger kritisch ist.
Warum existiert dieser Typ?
- Früher wichtig für Systeme mit wenig Speicher, heute noch nützlich in speziellen Anwendungen (z. B. eingebettete Systeme).
Int (integer)
Speichergröße: 32 Bit = 4 Byte
Wertebereich: −2 147 483 648 bis +2 147 483 647
Verwendung:
- Standard-Datentyp für Ganzzahlen in Java.
- Wird in Schleifen, Berechnungen und fast allen Programmen verwendet.
Warum existiert dieser Typ?
- Bietet einen guten Kompromiss zwischen Speicherbedarf und Zahlenbereich.
long
Speichergröße: 64 Bit = 8 Byte
Wertebereich: −9 223 372 036 854 775 808 bis +9 223 372 036 854 775 807
Verwendung:
- Für sehr große Ganzzahlen, z. B. bei Zeitstempeln (System.currentTimeMillis()), IDs oder Finanzberechnungen.
Warum existiert dieser Typ?
- Um Zahlenbereiche abzudecken, die über den int-Rahmen hinausgehen.
float
Speichergröße: 32 Bit = 4 Byte
Wertebereich: ca. ±3.4 × 10^38 (7 Nachkommastellen Genauigkeit)
Verwendung:
- Für Gleitkommazahlen mit begrenzter Genauigkeit.
- Typisch in Grafikberechnungen, Simulationen oder Spielen, wo Geschwindigkeit wichtiger ist als absolute Genauigkeit.
Warum existiert dieser Typ?
- Spart Speicher und Rechenzeit im Vergleich zu double.
double
Speichergröße: 64 Bit = 8 Byte
Wertebereich: ca. ±1.7 × 10^308 (15–16 Nachkommastellen Genauigkeit)
Verwendung:
- Standard-Datentyp für Fließkommazahlen in Java.
- Wird in wissenschaftlichen Berechnungen, Finanzmodellen und überall dort genutzt, wo Genauigkeit entscheidend ist.
Warum existiert dieser Typ?
- Liefert die nötige Präzision für komplexe mathematische Berechnungen.
📌 Zusammenfassung in einer Tabelle
|
Datentyp |
Speicher |
Wertebereich |
Typische Verwendung |
|
byte |
8 Bit (1 B) |
−128 bis +127 |
Kleine Ganzzahlen, Datenströme |
|
short |
16 Bit (2 B) |
−32 768 bis +32 767 |
Eingebettete Systeme, Speicheroptimierung |
|
int |
32 Bit (4 B) |
−2,1 Mrd. bis +2,1 Mrd. |
Standard-Ganzzahltyp |
|
long |
64 Bit (8 B) |
±9,22 Trillionen |
Zeitstempel, IDs, große Zahlen |
|
float |
32 Bit (4 B) |
±3.4 × 10^38 (7 Stellen) |
Grafik, Spiele, schnelle Berechnungen |
|
double |
64 Bit (8 B) |
±1.7 × 10^308 (15–16 Stellen) |
Wissenschaft, Finanzen, Standard für Gleitkommazahlen |
Nicht-numerische Datentypen
Neben den numerischen Datentypen stellt Java auch nicht-numerische Datentypen bereit. Diese dienen nicht der Darstellung von Zahlenwerten, sondern der Abbildung von logischen Zuständen, Zeichen oder komplexeren Strukturen. Sie sind unverzichtbar, um Programme nicht nur rechnen, sondern auch entscheiden, steuern und mit Texten arbeiten zu lassen.
Boolean
Speichergröße:
- In der Java-Spezifikation ist nur festgelegt, dass ein boolean zwei Werte annehmen kann: true oder false.
- Die exakte Speichergröße ist nicht standardisiert. In der Praxis wird er oft als 1 Byte (8 Bit) im Speicher abgelegt, da Prozessoren in Byte-Einheiten adressieren.
- In Arrays kann die JVM intern Optimierungen vornehmen (z. B. Bit-Packing).
Wertebereich:
Nur zwei mögliche Zustände:
- true (wahr)
- false (falsch)
Verwendung:
- Steuerung von Bedingungen in if-Abfragen, while-Schleifen oder for-Schleifen.
- Darstellung von logischen Zuständen (z. B. „ist angemeldet?“, „ist leer?“, „hat Zugriff?“).
- Grundlage für Vergleichsoperationen (==, <, >, etc.), die immer ein boolean zurückgeben.
Warum existiert dieser Typ?
- Um logische Entscheidungen im Programm abzubilden.
- Ohne boolean müsste man Zustände über Ganzzahlen (0/1) darstellen, was unübersichtlicher und fehleranfälliger wäre.
Char (Character / Zeichen)
Speichergröße:
- 16 Bit = 2 Byte
- In Java ist char immer 16 Bit groß, da er auf dem Unicode-Standard basiert.
- Damit können nicht nur ASCII-Zeichen (0–127), sondern auch internationale Schriftzeichen, Symbole und Sonderzeichen dargestellt werden.
Wertebereich:
- Von \u0000 (0) bis \uffff (65 535)
- Enthält alle Unicode-Zeichen, also Buchstaben, Ziffern, Satzzeichen, Symbole und sogar Emojis.
Verwendung:
- Speicherung einzelner Zeichen, z. B. 'A', '7', '?'.
- Grundlage für die Arbeit mit Strings, da ein String intern eine Sequenz von char-Werten ist.
- Nützlich für Zeichenoperationen, z. B. beim Parsen von Textdateien oder beim Arbeiten mit Protokollen.
Warum existiert dieser Typ?
- Um einzelne Zeichen unabhängig von Zahlenwerten darzustellen.
- Durch Unicode-Unterstützung ist Java von Anfang an internationalisiert – Programme können mit fast allen Sprachen und Symbolen arbeiten.
💡Hinweis: Um ein einzelnes Zeichen zu übergeben muss dieses in ‘ ‘ (Hochkommata) gestellt werden. Alternativ kann der Unicode-Wert mit \u übergeben werden. Dies gilt auch für Emoji.
Sonderfall: String
Neben den einfachen Datentypen gibt es in Java auch den Datentyp String zur Darstellung von Zeichenketten.
Strings nehmen eine Sonderrolle ein: Sie sind zwar fester Bestandteil der Sprache, gehören aber nicht zu den einfachen Datentypen. Stattdessen handelt es sich um eine Klasse, die zahlreiche Methoden bereitstellt wie etwa zum Vergleichen, Durchsuchen oder Bearbeiten von Texten.
Deklaration
In Java ist es notwendig, Variablen vor ihrer Verwendung zu deklarieren, weil die Sprache statisch typisiert ist. Das bedeutet: Der Compiler muss bereits beim Übersetzen des Programms wissen, welchen Datentyp eine Variable hat (z. B. int, double, String). Nur so kann er prüfen, ob Operationen korrekt sind und ob Speicherplatz richtig reserviert wird.
💡Merke: Bei der Deklaration werden der Datentyp und Bezeichner bekanntgegeben.
Zahlendarstellung
Computer arbeiten intern mit dem Binärsystem, doch für Programmierer ist es oft hilfreich, Zahlen auch in anderen Zahlensystemen darzustellen – etwa im Oktal- oder Hexadezimalsystem. Damit der Compiler oder Interpreter erkennt, in welchem Zahlensystem eine Zahl notiert ist, werden Präfixe verwendet.
Gängige Schreibweisen:
- Dezimal (Basis 10)
- Standarddarstellung ohne Präfix.
- Beispiel: 42 entspricht der Zahl 42 im Dezimalsystem.
- Oktal (Basis 8)
- Eingeleitet durch eine führende 0.
- Beispiel: 052 entspricht der Dezimalzahl 42.
- Hinweis: In modernen Sprachen wie Java ist Oktalschreibweise eher selten, aber noch unterstützt.
- Hexadezimal (Basis 16)
- Eingeleitet durch 0x oder 0X.
- Beispiel: 0x2A entspricht der Dezimalzahl 42.
- Hexadezimal wird häufig für Speicheradressen oder Farbwerte genutzt.
- Binär (Basis 2)
- Eingeleitet durch 0b oder 0B.
- Beispiel: 0b101010 entspricht der Dezimalzahl 42.
- Praktisch, um Bitmuster oder Flags darzustellen.
|
Zahlensystem |
Präfix |
Beispiel |
Wert in Dezimal |
|
Dezimal |
– |
42 |
42 |
|
Oktal |
0 |
052 |
42 |
|
Hexadezimal |
0x |
0x2A |
42 |
|
Binär |
0b |
0b101010 |
42 |
Beispiel
Programm zum Ausgeben mehrerer Variablen. Quelle: Technik-Kiste.de
1. Klassendefinition
public class BeispielVariablen {
- In Java muss jedes Programm in einer Klasse stehen.
- Der Klassenname lautet hier BeispielVariablen.
- public bedeutet, dass die Klasse von überall aus zugreifbar ist.
2. Die main-Methode
public static void main (String args []){
- Dies ist der Einstiegspunkt des Programms.
- Ohne diese Methode würde das Programm nicht starten.
- String args[] erlaubt es, Startparameter von außen an das Programm zu übergeben (hier aber ungenutzt).
3. Variablen und Konstanten
int age = 24;
- int ist ein Ganzzahl-Datentyp (32 Bit).
- Die Variable age speichert den Wert 24.
final int birth = 1995;
- final bedeutet: Konstante – der Wert kann nach der Zuweisung nicht mehr verändert werden.
- birth speichert das Geburtsjahr 1995.
String name = "Nathan Tristan";
- String ist ein Objekttyp für Zeichenketten.
- Die Variable name enthält den Text "Nathan Tristan".
4. Ausgabe auf der Konsole
System.out.println("Name: " + name + " | Age: " + age + " | Birth: " + birth);
- System.out.println gibt Text auf der Konsole aus.
- Mit dem Plus-Operator (+) werden Zeichenketten und Variablen aneinandergehängt (String-Konkatenation).
- Ergebnis der Ausgabe:
Name: Nathan Tristan | Age: 24 | Birth: 1995
Gültigkeitsbereiche von Variablen
Wie in C oder C++ spielt auch in Java der Ort der Deklaration einer Variablen eine entscheidende Rolle. Es ist möglich, dass mehrere Variablen mit demselben Namen existieren – allerdings jeweils in unterschiedlichen Gültigkeitsbereichen.
Ein Gültigkeitsbereich (Scope) ist im Wesentlichen ein Abschnitt des Programms, der durch geschweifte Klammern { ... } begrenzt wird. Dazu zählen auch die Parameter einer Methode.
- Globale Variablen: Wird eine Variable außerhalb einer Methode mit dem Schlüsselwort static deklariert, ist sie innerhalb der gesamten Klasse sichtbar. Man spricht hier von einer globalen Variablen.
- Lokale Variablen: Variablen, die innerhalb einer Methode oder eines Blocks definiert werden, sind nur in diesem Bereich gültig. Außerhalb des jeweiligen Blocks sind sie nicht mehr zugreifbar.
💡Hinweis: Statische, global deklarierte Variablen einer Klasse werden auch als Klassenvariablen bezeichnet.
Beispiel
Programm das aus der Ausgabe einer globalen und einer lokalen Variable gleichen Namens besteht. Quelle: Technik-Kiste.de
Beim ersten println in der main-Methode wird ausschließlich auf die globale Variable x zugegriffen. Anschließend wird jedoch innerhalb der Methode eine neue, gleichnamige lokale Variable deklariert. Das zweite println gibt daher den Wert dieser lokalen Variable aus. Sie überdeckt (überschattet) die globale Variable mit demselben Namen.
Typinterferenz
Seit Java 10 ist es in bestimmten Fällen möglich, den Datentyp bei der Variablendeklaration wegzulassen. Der Compiler erkennt den Typ automatisch anhand des zugewiesenen Werts. Anstelle einer expliziten Typangabe wird dabei das Schlüsselwort var verwendet.
Die automatische Typinferenz mit var funktioniert nicht in allen Situationen. Wichtig ist, dass einer Variablen bereits bei der Deklaration ein Wert zugewiesen wird, damit der Compiler den Typ ableiten kann. Während also folgende Schreibweise gültig ist:
int x;
x = 24;
führt die gleiche Vorgehensweise mit var zu einem Compilerfehler:
var x;
x = 24;
Ähnlich wie C, C++ oder C# setzt auch Java auf statische Typisierung. Das bedeutet: Der Datentyp einer Variablen wird bereits zur Kompilierzeit festgelegt und bleibt anschließend unveränderlich. In dynamisch typisierten Sprachen wie Python oder JavaScript ist das anders. Dort kann sich der Typ einer Variablen auch nachträglich während der Programmausführung ändern.
