zur vorherigen Seite   zum Inhaltsverzeichnis   zur nächsten Seite

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

Antwort:

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 eine schlechte Idee ist, können wir einem formalen Parameter oder einer lokalen Variablen den gleichen Namen geben wie einer Instanzvariablen, zum Beispiel:

class Konto
{
  . . . .
  private int kontostand;

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

}

Das 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 blau) erzeugt eine lokale Variable für die Methode verarbeiteEinzahlung(). 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 wir uns 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 welche 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 drohenden Schicksal warnen.

FRAGE 11:

Ist es schwierig dieses Problem abzuwenden?