Java-Variablen erklärt: Typen, Gültigkeitsbereich, var, final und häufige Fehler

.

目次

1. Was sind „Variablen“ in Java?

Wenn du beginnst, Java zu lernen, ist eines der ersten wichtigen Konzepte, dem du begegnest, die Variable.
Kurz gesagt, eine Variable ist ein Behälter, der Werte (Daten) vorübergehend in einem Programm speichert, damit du sie so oft wie nötig wiederverwenden kannst.

Allerdings gerätst du in Java schnell in Schwierigkeiten, wenn du Variablen nur als „Kisten“ betrachtest.
Das liegt daran, dass Java‑Variablen zusammen mit einem „Typ“ (der Art der Daten) behandelt werden.

In diesem Abschnitt ordnen wir die Rolle von Variablen und die Java‑spezifische Denkweise (die Bedeutung von Typen) für Anfänger.

1.1 Was du mit Variablen tun kannst (Werte speichern und wiederverwenden)

Mit Variablen kann ein Programm von „einmaligen Berechnungen“ zu „bedeutungsvoller Verarbeitung“ übergehen.

Zum Beispiel kannst du Zahlen direkt so schreiben:

System.out.println(100 + 20);

Das funktioniert, aber die Werte haben keine Bedeutung, sodass jeder, der den Code später liest (einschließlich deines zukünftigen Ichs), Schwierigkeiten hat.
Du weißt nicht „Was ist 100?“ oder „Was ist 20?“

Durch die Verwendung von Variablen kannst du den Werten Bedeutung verleihen.

int price = 100;
int tax = 20;
System.out.println(price + tax);

Variablen auf diese Weise zu nutzen, bringt folgende Vorteile mit sich:

  • Einfacheres Verstehen der Absicht (Namen wie price und tax vermitteln Bedeutung)
  • Werte können wiederholt verwendet werden (keine Notwendigkeit, denselben Wert immer wieder zu schreiben)
  • Einfacheres Ändern später (wenn sich der Steuersatz ändert, änderst du nur den Wert der Variable)
  • Zwischenergebnisse können behalten werden (komplexe Logik in kleinere Schritte zerlegen)

Gerade als Anfänger ist es in Ordnung, „Variablen = Benennen von Werten“ zu denken.
In Java kommt das nächste Konzept – die „Typen“ – jedoch immer als Set.

1.2 Java‑Variablen werden mit „Typen“ verwendet (Typensicherheit)

In Java werden Variablen im Allgemeinen in folgender Form erstellt:

type variableName = value;

Beispiel:

int age = 20;
String name = "Sagawa";

Der entscheidende Punkt hier ist der Typ.

  • int ist ein Ganzzahltyp (z. B. 20, 100, -5)
  • String ist ein Zeichenketten­typ (z. B. „Hello“, „Java“)

In Java deklarierst du beim Erstellen einer Variable explizit „welche Art von Wert diese Variable halten kann“.
Durch dieses System hat Java folgende Stärken.

Was bedeutet „typensicher“?

Da du Typen angibst, kann Java dich stoppen, wenn du versuchst, den falschen Wert in eine Variable zu legen.

Beispiel: Wenn du versuchst, eine Zeichenkette in eine int‑Variable zu schreiben, bekommst du einen Kompilierfehler.

int age = "20"; // This is an error

Das ist nicht lästig – es ist tatsächlich hilfreich.
Statt „nach dem Ausführen des Programms zu brechen“, kannst du „Fehler bereits vor dem Ausführen erkennen“.

Anfänger haben manchmal das Gefühl, „Java hat viele Fehler“, weil sie das so sehen, aber wenn du die Perspektive änderst:

  • Java findet Typ‑Mismatches frühzeitig
  • Je größer das Projekt, desto mehr helfen Typen, Unfälle zu reduzieren

Diese Idee – „Typen und Variablen kommen als Set“ – ist eines der grundlegendsten Basics von Java.

Hinweis: Auch bei „Variablen“ gibt es „Werte“ und „Referenzen“

Java‑Variablen werden im Großen und Ganzen auf zwei Arten behandelt:

  • Primitive Typen: halten den Wert selbst (z. B. int, double, boolean)
  • Referenztypen: halten nicht den Wert selbst, sondern den Ort (die Referenz), an dem der Wert gespeichert ist (z. B. String, Arrays, Klassen)

Wir gehen hier nicht tief darauf ein, aber das ist ein häufiger Verwirrungs­punkt für Anfänger, daher lohnt es sich, das gleich zu erwähnen.

Zum Beispiel ist String ein Referenztyp.
Es mag so aussehen, als würdest du „eine Zeichenkette speichern“, aber streng genommen hältst du „eine Referenz auf ein String‑Objekt“.

Dieser Unterschied hängt auch mit Themen zusammen, die du später lernst, wie „== vs equals“ und „wie sich final verhält“.

2. Grundlagen von Variablen: Der Unterschied zwischen Deklaration, Zuweisung und Initialisierung

Um Java‑Variablen korrekt zu verstehen,
ist es wichtig, die Unterschiede zwischen „Deklaration“, „Zuweisung“ und „Initialisierung“ zu ordnen.

Anfänger verwenden diese drei Wörter oft so, als ob sie dasselbe bedeuten,
aber in Wirklichkeit haben sie klar unterschiedliche Rollen.

Wenn du das ambigu lässt,
bist du eher geneigt, in den Zustand zu geraten
„Ich weiß nicht, warum das ein Fehler ist“ oder „Ich weiß nicht, warum ich es nicht verwenden kann.“

2.1 Deklaration: Vorbereitung zur Verwendung einer Variable

Deklaration bedeutet, Java zu sagen:
„Ich werde eine Variable mit diesem Namen verwenden“ und „ihr Typ ist dieser.“

Die grundlegendste Deklaration sieht so aus:

int count;

Bis jetzt sind nur diese zwei Dinge passiert:

  • Erstellen einer Variable namens count
  • Entscheiden, dass ihr Typ int (eine Ganzzahl) ist

Noch kein Wert wurde gespeichert.

Das ist ein gängiges Missverständnis bei Anfängern:
Das Deklarieren einer Variable allein macht sie nicht „verwendungsfertig.“

2.2 Zuweisung: Einen Wert in eine Variable legen

Zuweisung bedeutet, einen Wert in eine bereits deklarierte Variable zu legen.

count = 10;

Dieses = bedeutet nicht „gleich“ in der Mathematik.
Es bedeutet lege den Wert rechts in die Variable links.

Also wird der Ablauf:

int count;   // declaration
count = 10;  // assignment

Das ist die Idee.

Hinweis: Du kannst nicht zu einer undeclarierten Variable zuweisen

Der folgende Code führt zu einem Fehler:

count = 10; // Error: count has not been declared

In Java muss die Reihenfolge Deklaration → Zuweisung sein.

2.3 Initialisierung: Zuweisen eines Werts zur Zeit der Deklaration

Initialisierung bedeutet, Deklaration und Zuweisung gleichzeitig durchzuführen.

int count = 10;

Das ist semantisch dasselbe wie diese zwei Zeilen:

int count;
count = 10;

In Java – sowohl in der realen Arbeit als auch im Lernen –
in den meisten Fällen ist es in Ordnung, anzunehmen, dass du „Initialisierung“ verwendest.

Das liegt daran, dass es folgende Vorteile hat:

  • Die Variable wird sofort nach ihrer Erstellung verwendbar
  • Es verhindert Fehler durch uninitialisierte Variablen
  • Der Code wird leichter lesbar

Also als Anfänger wird empfohlen, die Gewohnheit zu entwickeln,
„Variablen zur Zeit ihrer Deklaration zu initialisieren.“

2.4 Warum du eine Variable nur mit Deklaration nicht verwenden kannst (Regeln für lokale Variablen)

In Java gibt es sehr strenge Regeln für lokale Variablen (Variablen innerhalb von Methoden).
Java ist hier besonders streng.

Der folgende Code führt zu einem Kompilierungsfehler:

int number;
System.out.println(number); // Error

Der Grund ist klar:

Lokale Variablen können nicht verwendet werden, es sei denn, sie sind initialisiert

Diese Regel existiert.

Java behandelt den Zustand „wir wissen nicht, was in number ist“ als
einen gefährlichen Zustand und stoppt es als Fehler vor der Ausführung.

Das mag für Anfänger streng wirken, aber in der großskaligen Entwicklung,
ist es ein sehr wichtiger Sicherheitsmechanismus.

2.5 Mehrere Variablen auf einmal deklarieren (mit Vorsicht)

In Java kannst du mehrere Variablen desselben Typs zusammen deklarieren.

int x, y, z;

Du kannst es auch so schreiben:

int a = 1, b = 2, c = 3;

Das ist syntaktisch korrekt, aber es kann die Lesbarkeit reduzieren, also sei vorsichtig.

Besonders für Anfänger und Team-Entwicklung ist es sicherer, zu schreiben:

int a = 1;
int b = 2;
int c = 3;

als eine Variable pro Zeile.

2.6 Abschnittszusammenfassung

Wichtige Punkte aus diesem Abschnitt zum Merken:

  • Deklaration : entscheide den Variablennamen und Typ
  • Zuweisung : lege einen Wert in eine Variable
  • Initialisierung : deklariere und weise gleichzeitig zu
  • Lokale Variablen können nicht verwendet werden, es sei denn, sie sind initialisiert
  • Als Anfänger, verwende „Deklaration + Initialisierung“ als Standard

3. Verständnis der Variablen „Typen“ (Primitive Typen und Referenztypen)

Beim Arbeiten mit Java-Variablen kannst du das Verständnis von Typen nicht vermeiden.
Was Anfänger oft verwirrt ist:

  • Warum es so viele Typen gibt
  • Warum Zahlen sowohl int als auch double haben
  • Wie String sich von numerischen Typen unterscheidet

.In diesem Abschnitt werden wir Java-Typen aus zwei Perspektiven organisieren:
„Primitive Typen“ und „Referenztypen.“

3.1 Java-Typen fallen in zwei große Kategorien

Java-Variablentypen können grob in die folgenden zwei Kategorien eingeteilt werden:

  1. Primitive Typen
  2. Referenztypen

Sobald Sie diese Klassifizierung verstehen, werden Themen, die Sie später lernen – wie „== vs equals“, „wie sich final verhält“ und „wie der Speicher funktioniert“ – viel leichter zu verstehen sein.

3.2 Was sind Primitive Typen? (Typen, die den Wert selbst halten)

Primitive Typen sind Typen, die den Wert selbst direkt halten.

Betrachten wir einige gängige primitive Typen:

int count = 10;
double price = 19.99;
boolean isActive = true;

Diese Variablen speichern
den „Wert selbst“ innerhalb der Variablen.

Häufig verwendete Primitive Typen

TypeMeaningExample Use
intIntegerCounts, age, number of times
longLarge integerAmounts of money, IDs
doubleDecimalPrices, ratios
booleanTrue/falseFlag checks
charSingle characterCharacter processing

Als Anfänger reicht es zunächst, int, double und boolean zu beherrschen.

3.3 Eigenschaften und Fallstricke von primitiven Typen

Primitive Typen haben die folgenden Eigenschaften:

  • Sie halten den Wert selbst
  • Sie sind schnell zu verarbeiten
  • Sie können nicht null zugewiesen bekommen
  • Die Größe ist fest

Zum Beispiel halten im nachfolgenden Code a und b völlig unabhängige Werte.

int a = 5;
int b = a;
b = 10;

In diesem Fall:

  • a bleibt 5
  • b ändert sich zu 10

Das ist das Ergebnis.

Das liegt daran, dass der Wert selbst kopiert wurde.

3.4 Was sind Referenztypen? (Typen, die den Ort des Wertes verwalten)

Auf der anderen Seite sind Referenztypen
Typen, die nicht den Wert selbst verwalten, sondern den Ort (Referenz), an dem der Wert existiert.

Typische Referenztypen umfassen:

String name = "Java";
int[] numbers = {1, 2, 3};
  • String
  • Arrays
  • Klassen
  • Schnittstellen
  • Sammlungen wie List / Map

All dies sind Referenztypen.

Verständnis von Referenztypen mit einem Bild

Eine Referenztyp-Variable hält:

  • nicht das eigentliche Objekt selbst, sondern
  • eine „Adresse“, die auf den Ort zeigt, an dem das eigentliche Objekt gespeichert ist

Das ist das gedankliche Modell.

3.5 Was passiert, wenn man Referenztypen zuweist?

Betrachten Sie den folgenden Code:

String a = "Hello";
String b = a;
b = "World";

In diesem Fall:

  • a ist „Hello“
  • b ist „World“

Das ist das Ergebnis.

Wenn Sie das nur so betrachten, könnten Sie denken,
„Ist das nicht dasselbe wie bei primitiven Typen?“

Was ist dann mit dem nächsten Beispiel?

int[] array1 = {1, 2, 3};
int[] array2 = array1;

array2[0] = 100;

Das Ergebnis ist:

  • array1[0] → 100
  • array2[0] → 100

Das passiert, weil array1 und array2 auf dasselbe Array verweisen.

Bei Referenztypen:

  • Das Zuweisen von Variablen kann dazu führen, dass sie „auf dasselbe tatsächliche Objekt zeigen“
  • Das Ändern des Inhalts kann alles beeinflussen, das darauf referenziert

Das ist das entscheidende Merkmal.

3.6 Häufige Verwirrungspunkte für Anfänger

Fassen wir die häufigen Stolpersteine zusammen:

  • Primitive Typen → der Wert wird kopiert
  • Referenztypen → die Referenz (der Ort) wird kopiert

Dieser Unterschied steht in starkem Zusammenhang mit den folgenden Themen:

  • Der Unterschied zwischen == und .equals()
  • Was passiert, wenn man final verwendet
  • Wie das Übergeben von Werten als Methodenargumente den Gültigkeitsbereich und das Verhalten beeinflusst

Für den Moment reicht es, sich Folgendes zu merken:
Referenztypen können manchmal dasselbe tatsächliche Objekt teilen.

3.7 Abschnittszusammenfassung

  • Java-Typen sind in primitive Typen und Referenztypen unterteilt
  • Primitive Typen behandeln „den Wert selbst“
  • Referenztypen behandeln „den Ort (die Referenz) des Wertes“
  • Bei Referenztypen können Zuweisungen und Änderungen andere Variablen beeinflussen

4. Arten von Variablen (Wo sie leben) und Gültigkeitsbereich (Wo sie gültig sind)

In Java unterscheiden sich Variablen nicht nur nach „Typ“.
Ihr Verhalten ändert sich auch abhängig davon, wo sie deklariert werden (wo sie leben).

Wenn Sie diesen Unterschied nicht verstehen, können Sie durch Dinge wie verwirrt werden:

.* “Ich kann die Variable, die ich vorher deklariert habe, nicht verwenden” * “Sie hat denselben Namen, aber der Wert ist anders” * “Ich verstehe nicht, warum ich hier nicht darauf verweisen kann”

In diesem Abschnitt organisieren wir
Variablentypen und Gültigkeitsbereiche für Anfänger.

4.1 Was ist der Gültigkeitsbereich? (Wo eine Variable verwendet werden kann)

Gültigkeitsbereich bedeutet
den Bereich, in dem eine Variable verwendet werden kann.

In Java wird der Gültigkeitsbereich streng bestimmt durch:

  • wo die Variable deklariert wird
  • den Bereich der geschweiften Klammern { }

Die Grundregel ist sehr einfach:

Eine Variable kann nur innerhalb des Blocks verwendet werden, in dem sie deklariert wurde

4.2 Lokale Variablen (Variablen innerhalb von Methoden)

Lokale Variablen sind Variablen, die innerhalb von Methoden oder Blöcken (wie if und for) deklariert werden.

public void sample() {
    int x = 10;  // local variable
    System.out.println(x);
}

Dieses x hat folgende Eigenschaften:

  • Nur innerhalb der Methode sample gültig
  • Verschwindet, wenn die Methode beendet ist

Beispiel für Gültigkeitsbereich mit Blöcken

if (true) {
    int y = 5;
    System.out.println(y);
}

System.out.println(y); // Error

Da y innerhalb des if‑Blocks deklariert ist, kann es außerhalb davon nicht verwendet werden.

Wichtige Regeln für lokale Variablen

Lokale Variablen haben strenge Regeln:

  • Man kann sie nicht verwenden, wenn sie nicht initialisiert sind
  • Es werden keine Standardwerte automatisch zugewiesen
    int value;
    System.out.println(value); // compile-time error
    

Dies ist Teil von Javas Sicherheitsdesign, um die Verwendung von „undefinierten Werten“ zu verhindern.

4.3 Felder (Instanzvariablen)

Felder sind Variablen, die innerhalb einer Klasse, aber außerhalb von Methoden deklariert werden.

public class Sample {
    int count;  // field (instance variable)

    public void printCount() {
        System.out.println(count);
    }
}

Felder haben andere Eigenschaften als lokale Variablen:

  • Jede Instanz der Klasse hat ihre eigene Kopie
  • Sie werden automatisch mit Standardwerten initialisiert
  • Sie können von jeder Methode in der Klasse verwendet werden

Standardwerte für Felder

Abhängig vom Typ werden die folgenden Standardwerte automatisch gesetzt:

  • int → 0
  • double → 0.0
  • boolean → false
  • Referenztypen → null

Daher erzeugt der folgende Code keinen Fehler:

public class Sample {
    int count;

    public void print() {
        System.out.println(count); // 0
    }
}

Allerdings wird es nicht empfohlen, sich zu sehr auf Standardwerte zu verlassen.
Explizite Initialisierung macht die Absicht des Codes klarer.

4.4 Statische Variablen (Klassenvariablen)

Eine Variable mit static wird zu einer Variable, die über die gesamte Klasse hinweg geteilt wird.

public class Counter {
    static int total = 0;
}

Dieses total hat folgende Eigenschaften:

  • Es gibt nur ein Exemplar pro Klasse
  • Von allen Instanzen gemeinsam genutzt

Mentales Modell für statische Variablen

  • Instanzvariablen → die Geldbörse jeder Person
  • statische Variablen → der gemeinsame Safe eines Unternehmens

Dieses Modell erleichtert das Verständnis.

Vorsicht bei statischen Variablen

Statische Variablen sind nützlich, aber das Speichern zu vieler Zustände kann Fehler verursachen.

  • Es ist schwer nachzuvollziehen, wo Änderungen stattgefunden haben
  • Tests werden schwieriger
  • Probleme treten eher bei paralleler Verarbeitung auf

Für Anfänger wird empfohlen, die Verwendung auf Folgendes zu beschränken:

  • Konstanten
  • Gemeinsame Konfigurationswerte

und ähnliche Zwecke.

4.5 Vorsicht bei Variablen mit demselben Namen (Shadowing)

Betrachten Sie den folgenden Code:

public class Sample {
    int value = 10;

    public void test() {
        int value = 5;
        System.out.println(value);
    }
}

In diesem Fall ist die Ausgabe 5.

Das liegt daran, dass die lokale Variable das Feld verdeckt (Shadowing).

Da dies eine häufige Verwirrungsquelle für Anfänger ist:

  • Vermeiden Sie doppelte Variablennamen
  • Verwenden Sie denselben Namen nicht erneut, es sei denn, es ist beabsichtigt

Diese Disziplin ist wichtig.

4.6 Abschnittszusammenfassung

  • Scope bedeutet „der Bereich, in dem eine Variable verwendet werden kann“
  • Lokale Variablen sind nur innerhalb von Blöcken gültig und müssen initialisiert werden
  • Felder werden automatisch mit Standardwerten zugewiesen
  • statische Variablen werden über die gesamte Klasse hinweg geteilt
  • Sei vorsichtig mit Shadowing, das durch Variablen mit demselben Namen verursacht wird

5. var (Typinferenz) korrekt in Java 10+ verwenden

In Java 10 eingeführt, ist var
eine Möglichkeit, den Compiler den Typ einer Variable ableiten zu lassen.

Es mag bequem aussehen, aber wenn es missbraucht wird, kann es leicht zu „schwer lesbarem Code“ führen.
Deshalb ist es wichtig, die Regeln und wann man es verwendet, zu verstehen.

5.1 Was ist var? (Wie es funktioniert, ohne den Typ zu schreiben)

In normalem Java deklariert man eine Variable so:

String message = "Hello";

Mit var kann man schreiben:

var message = "Hello";

An diesem Punkt schaut Java auf die rechte Seite "Hello" und entscheidet:

  • Diese Variable ist vom Typ String

Der wichtige Punkt ist, dass var keine dynamische Typisierung ist.

  • Der Typ wird zur Kompilierzeit bestimmt
  • Der Typ ändert sich nicht zur Laufzeit

Denke also an var als „Abkürzung, die es dir erlaubt, den Typ wegzulassen“.

5.2 Wo du var verwenden kannst und wo nicht

var kann nur an streng definierten Stellen verwendet werden.

Wo du es verwenden kannst

  • Nur lokale Variablen
    public void sample() {
        var count = 10;
    }
    

Wo du es nicht verwenden kannst

Alle der folgenden Verwendungen führen zu Fehlern:

var x;                 // No initialization → error
var y = null;          // Cannot infer the type → error

class Sample {
    var value = 10;    // Cannot be used for fields → error
}

Der Grund für diese Einschränkungen ist klar: um die Lesbarkeit und Sicherheit nicht zu verringern.

5.3 Vorteile der Verwendung von var

var glänzt, wenn
der Typ tendenziell lang wird.

ArrayList<String> list = new ArrayList<String>();

Mit var:

var list = new ArrayList<String>();

Es wird viel sauberer.

Mit anderen Worten, var ist nützlich, wenn:

  • Generics lang sind
  • Der Typ aus der rechten Seite offensichtlich ist

So verwendet, kann es die Lesbarkeit verbessern.

5.4 Fallstricke von var (Häufige Anfängerfehler)

var ist bequem, aber wenn Anfänger es übermäßig verwenden, können folgende Probleme auftreten.

Der Typ wird schwer zu sehen

var data = getData();

Aus dieser Zeile allein kannst du nicht erkennen:

  • Welchen Typ data hat
  • Was es enthält

In solchen Fällen ist es sicherer, den Typ explizit zu schreiben.

Data data = getData();

Es kann zu einem unbeabsichtigten Typ werden

var number = 10;   // int

Anfänger stoßen oft auf Fälle wie,
„Ich dachte, es wäre long.“

Wenn du den Typ nicht explizit schreibst, können deine Absicht und der tatsächliche abgeleitete Typ auseinandergehen, also sei vorsichtig.

5.5 Wie man entscheidet, ob man var verwendet

Wenn du unsicher bist, verwende diese Kriterien:

  • Wenn der Typ aus der rechten Seite offensichtlich ist → var ist OK
  • Wenn der Typ wichtige Bedeutung hat → schreibe den Typ explizit
  • Anfängerfreundlich / Lerncode → schreibe den Typ so viel wie möglich
  • Team-Entwicklung → folge den Coding-Standards

Besonders beim Lernen,
das Schreiben des Typs hilft, das Verständnis zu vertiefen,
deshalb musst du dich nicht zwingen, var zu verwenden.

5.6 Abschnittszusammenfassung

  • var ist eine Abkürzung für Typinferenz
  • Es ist keine dynamische Typisierung; der Typ ist zur Kompilierzeit festgelegt
  • Es ist nur für lokale Variablen und erfordert Initialisierung
  • Es ist wichtig zu unterscheiden, wann es die Lesbarkeit verbessert oder verringert

6. „Ich möchte diesen Wert nicht ändern“—final und die Idee von Konstanten

In Java ist die Design-Idee „sobald ein Wert festgelegt ist, lass ihn später nicht ändern“ sehr wichtig.

Das Werkzeug dafür ist final.

Anfänger denken oft „final ist etwas, das man auf Konstanten setzt“, aber in Wirklichkeit hat es eine breitere Bedeutung.

6.1 Was ist final? (Wiedereinschreibung verbieten)

Eine Variable mit final kann nach der ersten Zuweisung nicht mehr neu zugewiesen werden.

final int maxCount = 10;
maxCount = 20; // compile-time error

Die Regel ist sehr einfach:

  • Du kannst sie initialisieren
  • Du kannst sie nicht neu zuweisen

Das ist alles, was du dir merken musst.

6.2 Warum final bei lokalen Variablen verwenden?

Das Hinzufügen von final zu einer lokalen Variable macht klar, dass:

  • Diese Variable ändert sich nicht unterwegs
  • Der Wert ist festgelegt

Es hilft, deine Absicht im Code klar auszudrücken.

final int basePrice = 100;
int total = basePrice + 20;

So zu schreiben:

  • Hilft, versehentliche Änderungen zu verhindern
  • Lässt den Leser sicherer fühlen

Das sind die Vorteile.

6.3 final bei Feldern verwenden

Das Hinzufügen von final zu einem Feld macht es
zu einem unveränderlichen Wert für diese Instanz.

public class User {
    final String name;

    public User(String name) {
        this.name = name;
    }
}

In diesem Fall:

  • name kann nur einmal im Konstruktor gesetzt werden
  • Es kann danach nicht geändert werden

Das ist ein wichtiger Designansatz zur Stabilisierung des Objektzustands.

6.4 Wichtiger Hinweis zu final mit Referenztypen (Häufige Anfänger-Verwirrung)

Das ist ein sehr wichtiger Punkt:

final int[] numbers = {1, 2, 3};
numbers[0] = 100;   // OK
numbers = new int[]{4, 5, 6}; // Error

Warum passiert das?

Der Grund ist, dass final die „Neu-Zuweisung der Referenz“ einschränkt.

  • Ändern des Inhalts des Arrays → OK
  • Ändern, auf welches Array die Variable verweist → NG

Anders gesagt, macht final den Inhalt nicht unveränderlich.

Wenn du das nicht verstehst, könntest du verwirrt sein und denken:

  • „Warum kann es sich ändern, obwohl es final ist?“
  • „Ist das ein Bug?“

Deshalb ist dieser Unterschied wichtig.

6.5 Was ist eine Konstante? (static final)

In Java wird das, was die Leute üblicherweise eine „Konstante“ nennen, konventionell mit static final definiert.

public class Config {
    public static final int MAX_USERS = 100;
}

Diese Art von Konstante hat folgende Eigenschaften:

  • Geteilt über die gesamte Klasse
  • Der Wert kann nicht geändert werden
  • Du kannst ihr einen sinnvollen Namen geben

Namenskonvention für Konstanten

Konstanten werden im Allgemeinen im folgenden Stil geschrieben:

UPPER_SNAKE_CASE

Beispiel:

static final double TAX_RATE = 0.1;

6.6 Wie entscheidet man, wann final zu verwenden

Als Anfänger sind folgende Kriterien einfach zu verwenden:

  • Wenn der Wert nicht geändert werden muss → füge final hinzu
  • Konfigurationswerte / Basiswerte → verwende static final
  • Wenn versehentliche Änderungen problematisch wären → füge final hinzu

Besonders in der Praxis ist eine gängige Einstellung:

„Wenn du unsicher bist, füge final hinzu.“

In vielen Fällen ist das ein gutes Gleichgewicht.

6.7 Abschnittszusammenfassung

  • Mit final kannst du die Variable nicht neu zuweisen
  • Du kannst es für lokale Variablen und Felder verwenden
  • final bei Referenztypen bedeutet nicht „unveränderliche Inhalte“
  • Konstanten werden mit static final definiert
  • final ist ein Werkzeug zum Schreiben sichereren, klareren Codes

7. Anfangswerte, Standardwerte und häufige Fehler (Anfänger-Fallen-Behebung)

Bisher hast du über Deklarationen, Typen, Gültigkeitsbereich, var und final gelernt.
In der Praxis gibt es jedoch viele Situationen, in denen „Ich verstehe es konzeptionell, aber ich bekomme immer noch Fehler.“

In diesem Abschnitt organisieren wir häufige Anfänger-Stolpersteine zusammen mit den Gründen.

7.1 Lokale Variablen erhalten keine Standardwerte

Zuerst eine sehr wichtige Regel:

Lokale Variablen erhalten keine automatischen Standardwerte

Der folgende Code führt zu einem Compile-Time-Fehler:

public void sample() {
    int x;
    System.out.println(x); // Error
}

Der Grund ist einfach: Java erlaubt keinen Zustand, in dem „wir nicht wissen, was in x ist.“

Korrekter Ansatz

public void sample() {
    int x = 0;
    System.out.println(x);
}

Für lokale Variablen befolge streng die Regel: initialisiere sie immer selbst.

.### 7.2 Felder erhalten automatisch Standardwerte

Im Gegensatz dazu werden Felder (Instanzvariablen und statische Variablen) automatisch mit Anfangswerten belegt.

public class Sample {
    int count;
    boolean active;
    String name;
}

Die Standardwerte sind wie folgt:

  • int → 0
  • double → 0.0
  • boolean → false
  • Referenztypen → null

Daher erzeugt der folgende Code keinen Fehler:

public class Sample {
    int count;

    public void print() {
        System.out.println(count); // 0
    }
}

Allerdings sind Entwürfe, die sich auf Standardwerte verlassen, nicht empfehlenswert.
Sie erschweren das Erkennen der Absicht und können leicht zur Brutstätte für Fehler werden.

7.3 Fehler verursacht durch null (NullPointerException)

Der Standardwert für Referenztypen ist null.

String text;

Wenn du in diesem Zustand eine Methode aufrufst, bekommst du einen Laufzeitfehler:

System.out.println(text.length()); // NullPointerException

Dies ist eine der häufigsten Ausnahmen, auf die Anfänger stoßen.

Grundlegende Gegenmaßnahmen

  • Initialisiere, wann immer möglich
  • Berücksichtige die Möglichkeit von null
  • Entwerfe so, dass null unbeabsichtigt vermieden wird
    String text = "";
    

Selbst das Initialisieren mit einem leeren String kann viele Unfälle verhindern.

7.4 Verwendung einer Variablen außerhalb ihres Geltungsbereichs

Der folgende ist ein weiterer häufiger Fehler:

if (true) {
    int value = 10;
}

System.out.println(value); // Error

Dies ist ein Scope-out-Referenz-Problem.

  • value ist nur innerhalb des if‑Blocks gültig
  • Außerhalb des Blocks existiert es nicht

Bestätige diese Regel erneut.

7.5 Verwirrung durch Variablen mit gleichem Namen (Shadowing erneut betrachtet)

public class Sample {
    int value = 10;

    public void test() {
        int value = 5;
        System.out.println(value);
    }
}

Dieser Code gibt 5 aus.

Anfänger denken oft fälschlicherweise:

  • Der Feldwert wird verwendet

In Wirklichkeit hat jedoch der innere Geltungsbereich Vorrang.

Da Shadowing Verwirrung verursacht:

  • Verwende unterschiedliche Variablennamen je nach Rolle

Behalte das im Hinterkopf.

7.6 Compile‑Zeit‑Fehler durch Typinkompatibilitäten

Die folgende Zuweisung ist nicht erlaubt:

int number = 3.14; // Error

Das liegt daran:

  • doubleint wird nicht automatisch konvertiert

Das ist die Regel.

Korrekte Vorgehensweise (wenn du es beabsichtigst)

int number = (int) 3.14; // 3

Achte jedoch darauf, dass der Dezimalteil abgeschnitten wird.

7.7 Abschnittszusammenfassung

  • Lokale Variablen müssen initialisiert werden
  • Felder erhalten Standardwerte, aber man sollte nicht zu sehr darauf vertrauen
  • null verursacht häufig Laufzeitfehler
  • Du kannst Variablen nicht außerhalb ihres Geltungsbereichs verwenden
  • Typinkompatibilitäten werden durch Compile‑Zeit‑Fehler verhindert

8. Zusammenfassung: Wichtige Punkte, die man zuerst für Java-Variablen beherrschen sollte

In diesem Artikel haben wir das Thema „Java-Variablen“ Schritt für Schritt strukturiert, mit Fokus auf Punkte, die Anfänger häufig verwirren.

Abschließend fassen wir die wichtigsten Erkenntnisse in einer Form zusammen, die sowohl beim Lernen als auch in der Praxis nützlich ist.

8.1 Betrachte Java-Variablen als ein Set aus „Typ, Name und Wert“

Java-Variablen besitzen immer diese drei Elemente:

  • Typ : welche Art von Wert sie hält
  • Name : was der Wert repräsentiert
  • Wert : die tatsächlich gespeicherten Daten
    int count = 10;
    

Diese eine Zeile enthält die gesamte Essenz von Java-Variablen.

8.2 Deklaration, Zuweisung und Initialisierung klar unterscheiden

Ein häufiges Anfängerproblem ist das Vermischen der Unterschiede zwischen diesen drei Begriffen:

  • Deklaration: Vorbereitung zur Nutzung einer Variablen
  • Zuweisung: Einen Wert hineinschreiben
  • Initialisierung: Gleichzeitig deklarieren und zuweisen

Insbesondere bei lokalen Variablen, denk an die Regel: Du kannst sie nicht verwenden, solange sie nicht initialisiert sind.

8.3 Den Unterschied zwischen primitiven und Referenztypen kennen

. Primitive Typen: behandeln den Wert selbst
Referenztypen: behandeln den Ort (Referenz) des Wertes

Wenn Sie sich diesen Unterschied bewusst machen, hilft es Ihnen, das natürlich zu verstehen:

  • Wertkopieren
  • Wie Arrays und Objekte sich verhalten
  • Was final wirklich bedeutet

8.4 Das Verständnis von Gültigkeitsbereichen reduziert Fehler drastisch

Variablen können nur an dem Ort verwendet werden, an dem sie deklariert wurden.

  • Lokale Variablen → nur innerhalb von Blöcken gültig
  • Felder → im gesamten Klassenkörper verfügbar
  • statische Variablen → klassenweit geteilt

Wenn Sie jemals denken „Ich weiß nicht, warum ich es nicht benutzen kann“, verdächtigen Sie zuerst den Gültigkeitsbereich.

8.5 Verwenden Sie var und final je nach Zweck

  • var → Verwenden Sie es nur, wenn der Typ klar ist und die Lesbarkeit verbessert wird
  • final → Verwenden Sie es, um die Absicht klar auszudrücken: „Dieser Wert sollte sich nicht ändern“

Beide sind praktisch, aber achten Sie darauf, dass das „Verwenden“ nicht zum eigentlichen Ziel wird.

8.6 Richtlinien für Anfänger, um sicher zu programmieren

Während der Lernphase reduzieren die folgenden Richtlinien Fehler:

  • Variablen beim Deklarieren initialisieren
  • Typen nach Möglichkeit explizit angeben
  • Aussagekräftige Namen verwenden
  • Im Zweifelsfall final hinzufügen

Schon das allein bringt Sie zu lesbarem und sicherem Java-Code.

8.7 Nächste Themen zum Vertiefen des Verständnisses

Nachdem Sie Variablen verstanden haben, wird empfohlen, weiterzugehen zu:

  • Bedingungen ( if / switch )
  • Schleifen ( for / while )
  • Arrays und Sammlungen (List / Map)
  • Methoden und Parameter
  • Objektorientierte Grundlagen

Variablen sind das Fundament allen Java-Codes.

Wenn Sie sie gründlich verstehen, wird Ihr späteres Lernen deutlich reibungsloser.