3 Stimmen

Was ist der Geltungsbereich einer Java-Variable in einem Block?

Ich weiß, dass in c++ Variablen einen Blockumfang haben, zum Beispiel funktioniert der folgende Code in C++

void foo(){
    int a = 0;
    for(int i = 0; i < 10; ++i){
        int a = 1; // hier wird a neu definiert.
    }

}

aber dieser Ausschnitt funktioniert nicht in Java, es wird "duplicate local variable a" gemeldet, bedeutet das, dass Java-Variablen keinen Blockumfang haben?

10voto

Yakov Galka Punkte 65787

Sie haben einen Blockumfang. Das bedeutet, dass Sie sie außerhalb des Blocks nicht verwenden können. Allerdings verbietet Java, einen Namen im äußeren Block durch einen Namen im inneren zu verstecken.

4voto

sushil bharwani Punkte 28837

Java-Variablen haben einen Blockbereich, aber wenn Sie bemerken, ist int a bereits im Bereich definiert

  { 
     int a = 0;
      {
       {
        } 
      }

   }

alle Unterbereiche sind im Bereich der obersten geschweiften Klammern. Daher erhalten Sie einen Fehler für doppelte Variablen.

4voto

codaddict Punkte 426877

Abschnitt §14.4.2 sagt:

Der Geltungsbereich einer lokalen Variablendeklaration in einem Block (§14.2) ist der Rest des Blocks, in dem die Deklaration erscheint, beginnend mit ihrem eigenen Initialisierer (§14.4) und einschließlich weiterer Deklaratoren rechts in der lokalen Variablendeklarationsanweisung.

Der Name einer lokalen Variablen v darf nicht als lokale Variable der unmittelbar umgebenden Methode, Konstruktor oder Initialisierungsblock innerhalb des Geltungsbereichs von v neu deklariert werden, da ansonsten ein Kompilierungsfehler auftritt.

3voto

reko_t Punkte 53684

Die vorherigen Antworten haben bereits den Grund genannt, aber ich möchte nur zeigen, dass dies immer noch erlaubt ist:

void foo(){
    for(int i = 0; i < 10; ++i){
        int a = 1;
    }
    int a = 0;
}

In diesem Fall verdeckt das a in der Schleife nicht das äußere a, also ist es gültig.

Auch meiner Meinung nach sollte es in C++ auch so sein, es ist weniger verwirrend und verhindert die versehentliche Deklaration einer Variablen mit demselben Namen.

2voto

EboMike Punkte 74805

Es tut das, aber es ist verschachtelt, sodass das "a", das Sie in foo() definiert haben, in allen Blöcken innerhalb von foo verfügbar ist.

Hier ist ein Beispiel für das, was Sie suchen:

void foo(){
    {
        int a = 0;
        // Mach etwas mit a
    }
    for(int i = 0; i < 10; ++i){
        int a = 1; //definiere a hier.
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X