Java-Syntax und Datentypen verstehen: Variablen, Strings und Typumwandlungen
Von Anweisungen und Gültigkeitsbereichen über primitive Typen und Referenzen bis zu Arrays, Strings und Konvertierungen: Dieser Guide erklärt die Bausteine, aus denen verständlicher Java-Code entsteht.
Das Wichtigste vorab
Kurzfassung: ca. 1 Minute · vollständiger Artikel: ca. 11 Minuten
- Java ist statisch typisiert: Der Typ einer Variablen steht zur Übersetzungszeit fest und begrenzt, welche Werte und Operationen zulässig sind.
- Es gibt acht primitive Typen. Klassen, Interfaces, Arrays und Strings gehören dagegen zu den Referenztypen.
- Lokale Variablen müssen vor dem Lesen initialisiert sein. Felder erhalten Standardwerte, doch eine bewusste Initialisierung ist meist verständlicher.
String-Objekte sind unveränderlich. Ein scheinbar veränderter String ist tatsächlich ein neues Objekt.==vergleicht primitive Werte, bei Referenzen aber deren Identität. Für den inhaltlichen Vergleich verwendest du in der Regelequals().- Automatische Typumwandlungen sind nur dann erlaubt, wenn sie nach den Sprachregeln sicher sind. Ein Cast macht eine möglicherweise verlustbehaftete Umwandlung ausdrücklich sichtbar.

Syntax ist die Grammatik einer Programmiersprache; Datentypen geben den verwendeten Werten Bedeutung und Grenzen. Beides wirkt zusammen: Der Compiler prüft nicht nur Klammern und Semikolons, sondern auch, ob eine Zuweisung, Berechnung oder Methode zu den beteiligten Typen passt. Diese frühe Rückmeldung ist eine der großen Stärken von Java.
Das Grundgerüst von Java-Code
Java-Quellcode besteht aus Deklarationen, Ausdrücken, Anweisungen und Blöcken. Anweisungen enden häufig mit einem Semikolon. Geschweifte Klammern fassen mehrere Anweisungen zu einem Block zusammen und bestimmen zugleich oft einen Gültigkeitsbereich.
package de.tinytool.grundlagen;
public class TemperaturCheck {
public static void main(String[] args) {
double temperatur = 21.5;
if (temperatur >= 20.0) {
System.out.println("Angenehm warm");
}
}
}
Im Beispiel ist double temperatur = 21.5 eine Deklarationsanweisung. temperatur >= 20.0 ist ein Ausdruck, der einen booleschen Wert liefert. Der Block hinter if wird nur ausgeführt, wenn dieser Wert true ist.
TemperaturCheck steht üblicherweise in der Datei TemperaturCheck.java. Paketnamen werden kleingeschrieben, Klassennamen beginnen nach Java-Konvention mit einem Großbuchstaben.Kommentare gezielt einsetzen
// Kommentar bis zum Zeilenende
/* Kommentar über
mehrere Zeilen */
/** Dokumentation für Javadoc. */
Ein Kommentar sollte vor allem Absicht, Randbedingungen oder eine ungewöhnliche Entscheidung erklären. Was der Code bereits klar ausdrückt, muss nicht noch einmal in Worten danebenstehen.
Variablen, Initialisierung und Gültigkeit
Eine Variable verbindet einen Namen mit einem typisierten Speicherplatz. Bei der Deklaration legst du den Typ fest; bei der Initialisierung erhält die Variable ihren ersten Wert.
int anzahl; // deklariert, lokal noch nicht lesbar
anzahl = 3; // erster Wert
double preis = 19.90; // Deklaration und Initialisierung
final int MAX_VERSUCHE = 3;
Eine lokale Variable muss auf jedem möglichen Programmpfad initialisiert sein, bevor sie gelesen wird. Der Compiler verhindert so die Verwendung eines unbestimmten Werts. Felder einer Klasse erhalten zwar typspezifische Standardwerte, etwa 0, false oder null; eine fachlich sinnvolle Initialisierung macht den Zustand dennoch deutlicher.
Der Gültigkeitsbereich
int gesamt = 0;
for (int i = 0; i < 3; i++) {
int einzelwert = i * 10;
gesamt += einzelwert;
}
System.out.println(gesamt);
// i und einzelwert sind hier nicht mehr sichtbar.
Je kleiner der Gültigkeitsbereich, desto leichter lässt sich nachvollziehen, wo ein Wert entsteht und verändert wird. Deklariere lokale Variablen daher möglichst nahe an ihrer ersten Verwendung.
final schützt die Zuweisung
Eine mit final deklarierte Variable kann nach ihrer Initialisierung nicht auf einen anderen Wert beziehungsweise eine andere Referenz gesetzt werden. Bei einem veränderlichen Objekt bedeutet das jedoch nicht, dass auch sein innerer Zustand unveränderlich ist.
final List namen = new ArrayList<>();
namen.add("Ada"); // erlaubt: Das Objekt wird verändert.
// namen = List.of(); // nicht erlaubt: neue Referenz
Die acht primitiven Datentypen
Primitive Typen repräsentieren elementare Werte. Sie sind keine Objekte und können nicht null sein.
| Typ | Größe beziehungsweise Wertebereich | Typischer Einsatz |
|---|---|---|
boolean |
true oder false |
Bedingungen und Statuswerte |
byte |
8 Bit, −128 bis 127 | Binärdaten, kompakte Protokollwerte |
short |
16 Bit | selten; spezielle Datenformate |
int |
32 Bit | Standard für ganze Zahlen |
long |
64 Bit | große Zähler und Zeitwerte |
float |
32-Bit-Gleitkommazahl | Speicher-sensitive Mess- oder Grafikdaten |
double |
64-Bit-Gleitkommazahl | Standard für Fließkommarechnungen |
char |
16-Bit-UTF-16-Codeeinheit | einzelne UTF-16-Codeeinheiten |
boolean aktiv = true;
int besucher = 1_250_000;
long dateigroesse = 9_000_000_000L;
double temperatur = 21.5;
char initiale = 'G';
char ist nicht immer ein vollständiges sichtbares Zeichen. Manche Unicode-Zeichen benötigen zwei UTF-16-Codeeinheiten. Für die Verarbeitung von Unicode-Codepunkten bieten String und Character passende Methoden wie codePoints() und codePointAt().Geldbeträge sind kein double-Standardfall
Binäre Gleitkommatypen können viele Dezimalbrüche nicht exakt darstellen. Für Geldwerte mit festgelegten Dezimalregeln eignet sich häufig BigDecimal zusammen mit einer ausdrücklich gewählten Rundungsstrategie.
Referenztypen und null
Klassen, Interfaces, Records, Enums und Arrays definieren Referenztypen. Eine Variable dieses Typs enthält nicht das Objekt selbst, sondern eine Referenz darauf. Mehrere Variablen können deshalb dasselbe Objekt bezeichnen.
String ersterName = "Ada";
String zweiterName = ersterName;
int[] punkte = {12, 18, 24};
LocalDate heute = LocalDate.now();
Der besondere Wert null bedeutet, dass keine Objektreferenz vorhanden ist. Ein Methodenaufruf über null führt zu einer NullPointerException. Am besten modellierst du Pflichtwerte so, dass sie bereits beim Erzeugen eines Objekts vorhanden sind, und lässt null nicht unkontrolliert durch das Programm wandern.
Strings und Textblöcke
String ist eine Klasse und damit ein Referenztyp. String-Objekte sind unveränderlich: Methoden wie toUpperCase() oder replace() erzeugen einen neuen String, statt den bestehenden zu verändern.
String vorname = "Ada";
String begruessung = "Hallo, " + vorname + "!";
String gross = begruessung.toUpperCase();
System.out.println(begruessung); // Hallo, Ada!
System.out.println(gross); // HALLO, ADA!
Für viele Verkettungen in einer Schleife ist StringBuilder meist die passendere Wahl. Mehrzeilige Texte lassen sich mit Textblöcken lesbar notieren:
String json = """
{
"name": "Ada",
"aktiv": true
}
""";
Lokale Typinferenz mit var
Mit var kann der Compiler den Typ einer lokalen Variablen aus dem Initialisierer ableiten. Java bleibt dabei statisch typisiert; der Typ verschwindet nicht, er wird nur nicht doppelt hingeschrieben.
var titel = "Java-Grundlagen"; // String
var anzahl = 3; // int
var namen = List.of("Ada", "Linus"); // List
var ist nur für lokale Variablen mit Initialisierer vorgesehen. Es kann nicht für Felder, Methodenparameter oder Rückgabetypen verwendet werden. Auch var wert = null; ist nicht möglich, weil daraus kein konkreter Typ abgeleitet werden kann.
var ist hilfreich, wenn der Typ aus der rechten Seite sofort hervorgeht. Verschleiert die Abkürzung eine wichtige Information, ist der ausgeschriebene Typ besser.Typumwandlungen, Boxing und Unboxing
Bei einer erweiternden primitiven Konvertierung kann Java einen Wert automatisch in einen Typ mit passendem größerem Wertebereich überführen:
int stueckzahl = 42;
long grosseStueckzahl = stueckzahl;
double messwert = grosseStueckzahl;
Eine verengende Konvertierung muss ausdrücklich gecastet werden, weil Information verloren gehen kann:
double messwert = 19.95;
int ganzzahlig = (int) messwert; // Ergebnis: 19
long sehrGross = 3_000_000_000L;
int zuKlein = (int) sehrGross; // Überlauf: anderer Zahlenwert
Wrapperklassen wie Integer, Long und Double stellen primitive Werte als Objekte dar. Java kann zwischen int und Integer häufig automatisch wechseln. Das heißt Autoboxing beziehungsweise Unboxing.
List zahlen = new ArrayList<>();
zahlen.add(7); // Autoboxing: int -> Integer
int erste = zahlen.get(0); // Unboxing: Integer -> int
null scheitert: Enthält eine Integer-Referenz den Wert null, führt die automatische Umwandlung zu int zu einer NullPointerException.Arrays: mehrere Werte eines Typs
Ein Array speichert eine feste Anzahl von Elementen desselben Typs. Die Indizes beginnen bei 0; der letzte gültige Index ist daher length - 1.
int[] punkte = {12, 18, 24};
System.out.println(punkte[0]); // 12
System.out.println(punkte.length); // 3
for (int punkt : punkte) {
System.out.println(punkt);
}
Die Länge eines Arrays kann nach der Erzeugung nicht geändert werden. Wenn Elemente dynamisch hinzukommen oder entfernt werden sollen, ist eine Collection wie ArrayList oft geeigneter.
Werte und Objekte richtig vergleichen
Bei primitiven Typen vergleicht == die Werte. Bei Referenztypen prüft ==, ob beide Variablen auf dasselbe Objekt verweisen. Für einen fachlichen Inhaltsvergleich wird normalerweise equals() verwendet.
String a = new String("Java");
String b = new String("Java");
System.out.println(a == b); // false: verschiedene Objekte
System.out.println(a.equals(b)); // true: gleicher Inhalt
Wenn ein Wert null sein darf, ist Objects.equals(a, b) eine null-sichere Alternative. Bei eigenen Klassen solltest du equals() und hashCode() gemeinsam und konsistent implementieren – oder für reine Wertträger einen record prüfen.
Kurzvergleich mit Kotlin
| Aspekt | Java | Kotlin |
|---|---|---|
| Veränderbare Variable | int anzahl = 3; |
var anzahl = 3 |
| Nur einmal zuweisbar | final int anzahl = 3; |
val anzahl = 3 |
| Nullable Typ | Referenzen können grundsätzlich null sein |
String? kennzeichnet Nullbarkeit im Typ |
| Zahlenkonvertierung | teilweise automatisch, sonst Cast | ausdrücklich, etwa zahl.toLong() |
| String-Interpolation | Verkettung oder formatted() |
"Hallo, $name" |
Die Oberflächen unterscheiden sich, die grundlegenden Fragen bleiben gleich: Welchen Typ hat ein Wert, darf er fehlen, ist er veränderlich und welche Konvertierung ist beabsichtigt?
Best Practices und typische Fehler
Hilfreiche Gewohnheiten
- Aussagekräftige Namen wie
restBudgetstattxverwenden. - Den engsten passenden Gültigkeitsbereich wählen.
- Unveränderliche Werte mit
finalkenntlich machen. - Für Geldbeträge Dezimalregeln bewusst modellieren.
- Konvertierungen an Systemgrenzen validieren.
Häufige Stolperfallen
==für den Inhalt zweier Strings verwenden.- Von
doubleeine exakte Dezimalrechnung erwarten. - Beim Cast mögliche Überläufe ignorieren.
- Array-Grenzen mit
<= lengthüberschreiten. - Wrapperwerte unbemerkt von
nullentpacken.
Glossar
- Deklaration
- Einführung eines Namens samt Typ, beispielsweise
int anzahl. - Initialisierung
- Erste Zuweisung eines Werts an eine Variable.
- Primitiver Typ
- Einer der acht eingebauten Werttypen wie
intoderboolean. - Referenztyp
- Typ, dessen Variablen auf Objekte oder Arrays verweisen können.
- Literal
- Direkt im Quellcode notierter Wert wie
42,trueoder"Java". - Cast
- Ausdrückliche Typumwandlung, etwa
(int) messwert. - Autoboxing
- Automatische Verpackung eines primitiven Werts in seine Wrapperklasse.
- Gültigkeitsbereich
- Teil des Programms, in dem ein deklarierter Name sichtbar ist.
Fazit
Guter Java-Code beginnt mit klaren Typentscheidungen. Primitive Werte, Referenzen, Strings und Arrays erfüllen unterschiedliche Aufgaben; Variablen und Gültigkeitsbereiche machen ihre Lebensdauer sichtbar. Wer Konvertierungen bewusst behandelt und Inhalts- von Identitätsvergleichen unterscheidet, verhindert viele Fehler bereits beim Kompilieren. Der nächste Schritt besteht darin, diese Werte mit Bedingungen und Schleifen durch ein Programm zu führen.
Offizielle Quellen und Vertiefung
- Dev.java: Java Language Basics
- Dev.java: Primitive Type Variables
- Dev.java: Arrays
- Dev.java: Expressions, Statements and Blocks
- Java Language Specification: Types, Values, and Variables
- Java Language Specification: Conversions and Contexts
- Kotlin Documentation: Basic Syntax
- Kotlin Documentation: Null Safety



tiny-tool.de
tiny-tool.de