Kann der gleiche Bezeichner als Name für eine lokale Variable in zwei verschiedenen Methoden verwendet werden?

Eine gute Antwort könnte sein:

Ja—der Gültigkeitsbereichs überschneidet sich nicht, also wird es zwei lokale Variablen geben, eine pro Methode, jede mit dem gleichen Namen.

Instanzvariable und lokale Variable mit dem gleichen Namen

Obwohl es normalerweise ein schlechte Idee ist, können Sie einem formalen Parameter oder einer lokale Variablen den gleichen Namen geben wie einer Instanzvariable. Zum Beispiel

class KontoChecker
{
  . . . .
  private int kontoStand;

  . . . .
  void  verarbeiteEinzahlung( int betrag )
  {
    int kontoStand = 0;                // neue Deklaration von kontoStand.
    kontoStand = kontoStand + betrag ; // verwendet die lokale Variable kontoStand.
  }

}

Dies ist kein Syntaxfehler (obwohl es wahrscheinlich ein logischer Fehler, ein Bug ist). Der Compiler wird diesen Code ohne Beschwerde kompilieren. Die zweite Deklaration von kontoStand (die in rot) erzeugt eine lokale Variable für die verarbeiteEinzahlung() Methode. Der Gültigkeitsbereich dieser Variable beginnt mit ihrer Deklaration und endet mit dem Ende der Methode (so wie bei allen lokalen Variablen). Also verwendet die nächste Anweisung die lokale Variable, nicht die Instanzvariable.

Wenn diese modifizierte Methode aufgerufen wird, wird sie betrag der lokalen Variablen kontoStand hinzufügen, und dann zum Aufrufer zurückkehren. Die lokale Variable wird keinen Wert mehr enthalten, nachdem sie zum Aufrufer zurückgekehrt ist. Die Instanzvariable wird sich nicht geändert haben.

Hinweis:   Stellen Sie sich die Anweisungen vor, als wenn Sie von Ihrer Stelle ab "aufwärts" suchen, um jede ihrer Variablen zu finden. Die erste, die sie sehen ist die, die sie verwenden. Sie können von ihrer "verspiegelten Glasbox" in jeder Richtung nach außen sehen, wenn sie die Variable nicht in ihrer eigenen Methode finden.

Es ist fast immer ein Fehler den gleichen Namen für eine Instanzvariable und eine lokale Variable (oder einen formalen Parameter) zu verwenden. Aber es ist kein Syntaxfehler, also wird Sie der Compiler nicht vor dem drohendem Schicksal warnen.

FRAGE 11:

Ist es schwierig dieses Problem abzuwenden?