Lädt...

Gültigkeitsbereich in Java

Schreibe eine Methode namens mark mit einem Parameter: static void mark(int n). Innerhalb der geschweiften Klammern drucke diesen Parameter mit System.out.println(n);. Aus main rufe mark(4); auf. Der Bildschirm soll eine Zeile zeigen: 4. Der Name n existiert nur innerhalb von mark. Wenn du n aus main drucken willst, lehnt javac ab. Genau diese Grenze — welche Namen eine Methode sehen kann — lehrt diese Seite.

Namen, die in einer Methode bleiben

Auf der Überladungsseite teilten mehrere paint-Methoden einen Namen, behielten aber getrennte Parameterlisten. Hier ist der Fokus kleiner: eine Methode, ein Parametername und wo dieser Name stehen darf. Ein Parameter ist ein Name, der der Methode gehört, die ihn deklariert. Außerhalb der geschweiften Klammern dieser Methode ist der Name weg.
Lege eine kleine Programmdatei namens Gate.java an. Die public class in der ersten Zeile muss zum Dateinamen passen: public class Gate. Lass keinen älteren Sign- oder Box-Klassennamen in dieser Datei; der Compiler erwartet, dass Klassenname und Dateiname übereinstimmen.
Außerhalb von main, aber noch innerhalb der Klassenklammern, schreibe static void mark(int n). Der Körper hat einen Druck: System.out.println(n);. Behalte auf dieser Seite void. Du beobachtest Sichtbarkeit, keine Rückgabewerte. Speichere die Datei vor dem Kompilieren. Das vollständige erste Programm steht in der nächsten Box.

Gate.java mit mark

Das ist die Version, die du zuerst kompilierst. main hält den Aufruf. mark hält den Druck, der n nutzt.

mark prints its parameter

java
public class Gate {
    public static void main(String[] args) {
        mark(4);
    }

    static void mark(int n) {
        System.out.println(n);
    }
}

Aus dem Ordner, der Gate.java enthält, führe javac Gate.java aus. Wenn runde Klammern, geschweifte Klammern und Semikolons passen, schreibt javac keine eigene Zeile. Dann führe java Gate aus — nicht java Gate.java. Lass die Endung .java beim zweiten Befehl weg. Dieselben zwei Befehle funktionieren unter Windows und macOS. Das Programm soll eine Zeile drucken und stoppen: 4. Es soll dich nicht tippen lassen. Wenn das Terminal auf Tastatureingabe wartet, steckt noch ein nextLine-Aufruf aus einer älteren Übung in der Datei. Lösche diesen Aufruf und behalte mark(4); plus die Methode mark oben.
Gehe den Lauf einmal der Reihe nach durch. Java startet bei main. Der Aufruf mark(4) schickt 4 in den Parameter n. Innerhalb von mark schreibt println(n) die 4. Wenn mark endet, ist auch der Name n zu Ende. main hatte nie einen Namen n. Die Zahl 4 überquerte den Aufruf als Wert. Der Name n wanderte nicht nach main.
Wenn du nach dem Aufruf System.out.println(n); in main einfügst, meldet javac, dass es das Symbol n nicht findet. Dieser Fehler ist die Lektion: n wurde in main nie deklariert. Behebe das, indem du die Zeile aus main entfernst, oder deklariere dort einen anderen Namen, wenn du einen lokalen brauchst. Erwarte nicht, dass der Parameter von mark von selbst in main erscheint.

Ein lokaler Name neben dem Parameter

Innerhalb von mark kannst du auch einen neuen Namen deklarieren, der kein Parameter ist. Dieser lokale Name lebt nur zwischen den Klammern von mark. Ändere den Körper so, dass er ein Label speichert und Label sowie n in einer Zeile druckt, oder behalte eine zweite kurze Methode für die Demo — auf dieser Seite zeigt die nächste Box stattdessen das Übergeben eines Namens aus main, der übliche Anfängerweg.
Eine häufige Anfängerhoffnung ist, dass ein in main deklarierter Name automatisch in jeder Methode der Klasse sichtbar ist. Auf dieser Form ist das nicht so. Wenn main int room = 4; hat und mark room ohne Empfang drucken will, findet javac room innerhalb von mark nicht. Die Lösung ist, den Wert zu übergeben: mark(room); mit weiterhin mark(int n).

Einen main-Lokalen an mark übergeben

Deklariere int room = 4; innerhalb von main. Rufe mark(room); auf. Innerhalb von mark drucke weiter n. Der Bildschirm zeigt weiterhin 4. Der lokale Name in main ist room. Der Parametername in mark ist n. Es sind unterschiedliche Namen an unterschiedlichen Orten. Der Wert 4 ist das, was reist.

pass room into mark

java
public class Gate {
    public static void main(String[] args) {
        int room = 4;
        mark(room);
    }

    static void mark(int n) {
        System.out.println(n);
    }
}

Kompiliere und führe erneut aus: javac Gate.java, dann java Gate. Du siehst weiterhin eine Zeile: 4. Wenn du room auf 9 änderst und den Methodenkörper lässt, zeigt der Bildschirm 9. Die Methode druckt weiter, was in n ankam. main kann room auch drucken, wenn du System.out.println(room); in main hinzufügst — dieser Name gehört dorthin. main kann weiterhin n nicht drucken.
Wenn mark ein eigenes Lokales deklariert — zum Beispiel int tag = 1; innerhalb der Klammern — ist dieses tag für main unsichtbar. System.out.println(tag); in main scheitert aus demselben Grund wie das Drucken von n aus main. Die Klammern von mark sind eine Wand für Namen, die darin deklariert sind.

Was die Wand schützt

Lies die Trennung in klaren Worten. In main deklarierte Namen bleiben in main, sofern du ihre Werte nicht in einen Aufruf übergibst. In mark deklarierte Namen — Parameter und Lokale — bleiben in mark. Der Aufruf trägt Werte, nicht die Namen selbst. Überladung von der vorherigen Seite ist eine andere Fertigkeit: mehrere Methoden mit einem gemeinsamen Methodennamen. Gültigkeitsbereich geht darum, wo ein Variablen- oder Parametername im Quelltext stehen darf.
Eine übrig gebliebene Sign-Demo mit mehreren paint-Methoden kann in derselben Datei sitzen und den Bildschirm verwirren, wenn main noch paint("ok") aufruft. Räume main auf den mark-Aufruf, den du testest. Verschachtele mark nicht in den Klammern von main. Methoden sitzen in der Klasse neben main.
System.out.println("n"); in main druckt den Buchstaben n in Anführungszeichen. Es druckt nicht den Parameter. Behalte println(n) innerhalb von mark, wenn du den Wert willst, der durch den Aufruf ankam. mark(); mit leeren Klammern scheitert, wenn der Kopf noch mark(int n) sagt — der Aufruf muss ein int senden, ob Literal wie 4 oder Lokal wie room.

Vor recursion

Du kannst mark(int n) schreiben, n innerhalb dieser Methode drucken und n aus main heraushalten. Du kannst room in main deklarieren und room an mark übergeben. Der Bildschirm zeigt den Wert, der den Aufruf überquerte. Namen sickern nicht von selbst durch die Klammern. Die nächste Seite ist recursion, wo eine Methode sich selbst mit einem kleineren Argument aufruft, bis eine Stoppbedingung die Kette beendet.

🧠 Testen Sie Ihr Wissen

Bereit zum Start

Testen Sie Ihr Wissen

Fordern Sie sich mit diesem interaktiven Quiz heraus und sehen Sie, wie gut Sie das Thema verstehen

❓
6
Fragen
🎯
70%
Zum Bestehen
♾️
∞
Zeit
🔄
∞
Versuche

📝 Anweisungen

  • Lesen Sie jede Frage sorgfältig
  • Wählen Sie die beste Antwort für jede Frage
  • Sie können das Quiz so oft wiederholen, wie Sie möchten
  • Ihr Fortschritt wird oben angezeigt