Durch seine Deklaration lebt jeder Bezeichner in einem bestimmten Namensraum. Alle Bezeichner in einem Namensraum müssen verschieden sein.
Wird ein Bezeichner angewendet, muß festgestellt werden, in welchem Namensraum er lebt um dann auf seine deklarierten Eigenschaften zugreifen zu können.
Der gleiche Bezeichner darf in verschiedenen Namensräumen leben:
class Reuse { Reuse Reuse(Reuse Reuse) { Reuse: for (;;) { if (Reuse.Reuse(Reuse) == Reuse) break Reuse; } return Reuse; } }
Namensräume in Java
Die Namensräume sind geschachtelt, dh. Deklarationen in inneren Strukturen können die Deklarationen in äußeren Strukturen verdecken.
Beispiel:
der Name eines Konstruktorparameters überdeckt den Namen einer Instanzvariable.
class MyClass { T myattr; MyClass (T myattr) { this.myattr = myattr; } }
Ausnahme:
Die Schachtelung von Blöcken und for-Schleifen kann nicht dazu benutzt werden, Bezeichner aus äußeren Blöcken, for-Schleifen und Methoden-Parameter zu überdecken.
class nesti { static public void main(String a[]) { double d = 9.9; for (int i = 0; i < 10; i++) { int d; // FEHLER boolean a; // FEHLER char i; // FEHLER ... } } }
liefert
'd' is already defined in this method. 'a' is already defined in this method. 'i' is already defined in this method.