Java-Syntax und Datentypen verstehen: Variablen, Strings und Typumwandlungen

Von · Softwareentwickler und Autor von tiny-tool.de

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 Regel equals().
  • Automatische Typumwandlungen sind nur dann erlaubt, wenn sie nach den Sprachregeln sicher sind. Ein Cast macht eine möglicherweise verlustbehaftete Umwandlung ausdrücklich sichtbar.
Geordnete leuchtende Bausteine stehen für primitive und Referenzdatentypen, die sich zu Java-Code verbinden.
KI-generierte Illustration von Datentypen als geordnete Bausteine eines Java-Programms.

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.

Dateiname und öffentliche Klasse: Eine öffentliche Top-Level-Klasse namens 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.

Wichtig: „Primitiv liegt immer auf dem Stack, Objekt immer auf dem Heap“ ist als Lernregel zu grob. Die Java-Sprachspezifikation beschreibt Typen und Verhalten, nicht eine für jede JVM-Ausführung starre physische Speicherposition.

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.

Lesbarkeit entscheidet: 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
Unboxing von 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 restBudget statt x verwenden.
  • Den engsten passenden Gültigkeitsbereich wählen.
  • Unveränderliche Werte mit final kenntlich machen.
  • Für Geldbeträge Dezimalregeln bewusst modellieren.
  • Konvertierungen an Systemgrenzen validieren.

Häufige Stolperfallen

  • == für den Inhalt zweier Strings verwenden.
  • Von double eine exakte Dezimalrechnung erwarten.
  • Beim Cast mögliche Überläufe ignorieren.
  • Array-Grenzen mit <= length überschreiten.
  • Wrapperwerte unbemerkt von null entpacken.
Compilerwarnungen sind Lernhinweise: Aktiviere die Prüfungen deiner IDE und lies die vollständige Meldung. Sie zeigt meist Typ, Stelle und Grund des Problems präziser als ein bloßes Ausprobieren verschiedener Schreibweisen.

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 int oder boolean.
Referenztyp
Typ, dessen Variablen auf Objekte oder Arrays verweisen können.
Literal
Direkt im Quellcode notierter Wert wie 42, true oder "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

Transparenzhinweis


Transparenzhinweis:
Die Inhalte auf tiny-tool.de werden sorgfältig recherchiert, redaktionell geprüft und regelmäßig aktualisiert. Quellen und Zitate werden möglichst nachvollziehbar angegeben. Dennoch übernehmen wir keine Garantie für Richtigkeit, Vollständigkeit oder Aktualität der bereitgestellten Informationen. Irrtümer sind nicht ausgeschlossen.

Redaktion und Einsatz von KI: Bei der Erstellung von Inhalten können digitale Werkzeuge – darunter auch KI-basierte Assistenzsysteme – unterstützend eingesetzt werden, etwa bei Recherche, Strukturierung, sprachlicher Überarbeitung, Übersetzung, Codeanalyse oder visueller Gestaltung. Veröffentlichte Inhalte werden redaktionell geprüft, bearbeitet und von Guido Zeuner freigegeben. Auswahl, Einordnung und Veröffentlichung liegen beim Menschen. KI-Ausgaben gelten nicht als eigenständige Quellen. KI-Systeme sind keine verantwortlichen Autoren oder Redakteure. Weitere Informationen zu Texten, Bildern, Videos und digitalen Personas findest du auf unserer Seite Transparenz beim Einsatz von Künstlicher Intelligenz.

Reichweitenmessung (VG WORT / METIS): Zur Ermittlung der Reichweite einzelner Texte können Zählmarken der VG WORT eingesetzt werden. Im Rahmen der METIS-Zugriffszählung kann eine Client-ID gebildet und ein sogenanntes „METIS Session Cookie“ gesetzt werden. Die Messung dient der statistischen Ermittlung von Textzugriffen und als Grundlage für mögliche Ausschüttungen der VG WORT. Nach Angaben der VG WORT werden dabei keine personenbezogenen Nutzungsprofile erstellt; die Messung dient nicht der Werbung oder dem Marketing-Tracking. Weitere Informationen findest du in unseren Datenschutzhinweisen.

Bitte beachte: Die Inhalte dienen ausschließlich der allgemeinen Information und stellen keine fachliche Beratung dar, insbesondere keine rechtliche, steuerliche, medizinische, technische oder finanzielle Beratung. Die Nutzung der Inhalte erfolgt auf eigene Verantwortung.

Werbung und Affiliate-Links: Einige Beiträge können werbliche Hinweise oder sogenannte Affiliate-Links enthalten. Diese werden entsprechend gekennzeichnet. Beim Klick entstehen dir keine zusätzlichen Kosten; wir erhalten gegebenenfalls eine kleine Provision.

Markenrechtlicher Hinweis: Alle Markennamen, Logos und Produktbezeichnungen sind Eigentum der jeweiligen Rechteinhaber und werden ausschließlich zur Identifikation und Beschreibung verwendet. Eine Verbindung zu den genannten Unternehmen besteht nur, wenn dies ausdrücklich angegeben wird.

Externe Links: Diese Website enthält Verweise auf externe Websites Dritter. Trotz sorgfältiger Prüfung übernehmen wir keine Verantwortung für deren Inhalte. Bei Bekanntwerden rechtswidriger Inhalte werden entsprechende Links geprüft und gegebenenfalls entfernt.