~Java4Beginners~
~Java4Beginners~

Geltungsbereich

Der Geltungsbereich von Variablen ist der Bereich eines Programmes, in dem Variablen gültig sind, d. h. wo ich Zugriff auf die Variable habe.

Es ist in Java durchaus möglich, dass ich verschiedene Variablen mit dem gleichen Bezeichner habe. Dies deutet schon darauf hin, dass es verschiedene Bereiche geben muss, da es nicht machbar ist, dass ich auf einer Ebene 3 Variablen mit dem gleichen Namen habe.

Wir haben verschiedene Bereiche von Variablen.
  • Instanzvariablen und Klassenvariablen
  • lokale Variablen und Parameter
  • Blockvariablen

Instanzvariablen

Der Zugriff auf Instanzvariablen kann nur innerhalb der Klasse erfolgen, in welcher Sie deklariert wurden. Bei Instanzvariablen werden Zugriffsmodifizierer verwendet.

lokale Variablen und Parameter

Auf lokale Variablen und Parameter kann nur innerhalb der Methode zugegriffen werden, in welcher Sie deklariert wurden. Das Verwenden von Zugriffsmodifizierer ist für lokale Variablen und Parameter nicht gestattet. Die Laufzeit der lokalen Variablen ist vom Aufruf der Methode, bis zum Ende der Methode.

Blockvariablen

Ein Programmblock (Methode, Kontrollstruktur, etc. ) ist gekennzeichnet von einer öffnenden { und einer schließenden }. Blockvariablen werden innerhalb dieses Programmblockes deklariert und sind somit lokale Variablen innerhalb dieses Programmblockes.

Verfahren der Entwicklungsumgebung bei gleichen Variablennamen

Wenn die Entwicklungsumgebung auf eine Variable trifft, werden folgende logische Schritte durchgeführt.
  1. Suche nach der Variablendeklaration im aktuellen Block.
  2. Suche nach der Variablendeklaration im übergeordneten Block, falls im aktuellen Block keine Deklaration gefunden wird.
  3. Schritt 2 wird so lange wiederholt, bis die Variablendeklaration gefunden wurde.
  4. Falls keine Variablendeklaration gefunden wurde, gibt die Entwicklungsumgebung eine Fehlermeldung aus.


Sehen wir uns an Hand des Quellcodes an, was passiert ist. Zu Beginn der Klasse wurde die Variable zahl1 deklariert und mit dem Wert 1 initialisiert.

Die erste Anweisung in der Main-Methode ist die Ausgabe des Wertes von zahl1. Diese wird korrekterweise mit 1 ausgegeben. Im Programmblock der Main-Methode befindet sich keine Variablendeklaration, also wird im übergeordneten Programmblock gesucht. Dieses ist die Klasse selber, wo wir eine Variablendeklaration finden. Dieser Wert wurde mit 1 initialisiert, welcher auch ausgegeben wurde.

Nun erfolgt ein Methodenaufruf für die Methode setZahl. Dieser Methode wird der Parameterwert 3 mitgegeben.

Innerhalb der Methode setZahl wurde eine Variable zahl1 deklariert, welche mit dem Parameterwert initialisiert wird. Bei der Ausgabe innerhalb der Methode setZahl wird nach der Variablendeklaration gesucht. Da eine Variablendeklaration von zahl1 gefunden wird, wird auch der Wert von dieser Blockvariablen ausgegeben.

Die nächste Anweisung in unserer Main-Methode ist wieder die Ausgabe des Wertes von zahl1. Hier wiederholt sich der Schritt, dass in der Main-Methode keine Deklaration erfolgte, sondern im übergeordneten Programmblock, also direkt in der Klasse. Durch die Methode setZahl wurde nur die Blockvariable der Methode setZahl geändert. Ein Zugriff auf die Variable direkt nach der Klassendeklaration erfolgte nicht. Von daher wird der Wert 1 ausgegeben.

Im Programmablauf wurde zwar eine Variable zahl1 auf den Wert 3 gesetzt, allerdings nicht gewünschte. Vielleicht können Sie hier schon erkennen, welche Probleme zukünftig auf uns zukommen werden, wenn wir Variablen nicht eindeutig verwenden.

In der Entwicklungsumgebung wird uns kein Fehler bei der Deklaration von zahl1 angezeigt, weil die Entwicklungsumgebung eben nach obigem Schema arbeitet und es deshalb zu keinem Compilerfehler kommt. Allerdings zeigt uns die Entwicklungsumgebung über eine Warnmeldung am Rande der Methode setZahl an, dass wir mit der Variablendeklaration von zahl1 lokal ein anderes Feld (Variable) verdecken.



Wenn wir die Variablendeklaration in der Methode setZahl weglassen, würde bei Methodenaufruf in der Methode nach einer Deklaration gesucht werden. Da keine erfolgt, wird in der übergeordneten Programmebene nach der Deklaration gesucht. Da dort eine Deklaration vorhanden ist, wird mit der Initialisierung von zahl1 innerhalb der Methode, die Variable zahl1 initialisiert, welche sich in der übergeordneten Programmebene befindet.

Dieses ist in folgendem Quelltext ersichtlich, in welchem eine Methode setZahl1 hinzugefügt wurde.

Schlüsselwort static

Sicherlich ist dem ein oder anderen im Quelltext von Geltungsbereich.java aufgefallen, dass bei der Variablen- und Methodendeklaration das Schlüsselwort static verwendet wurde. Lassen Sie mich hier nun kurz erklären, was es mit diesem static auf sich hat.

Das Schlüsselwort static verwenden wir immer dann, wenn wir auf eine Methode oder Variable innnerhalb der Klasse zugreifen wollen, ohne dass wir ein Objekt der Klasse erzeugen. Der Zugriff auf diese static-Variablen kann auch Klassenübergreifend passieren. Die Syntax hierfür ist eigentlich ähnlich wie beim Aufruf über die erzeugten Objekte. Um eine Variable oder Methode einer Klasse aufzurufen, ohne dass wir ein Objekt davon erzeugen, geben wir den Namen der Klasse ein, setzten dahinter einen Punkt und wählen die gewünschte Aktion aus. Dies funktioniert allerdings nur innerhalb des gleichen packages. Sollte sich die Klasse z. B. in einer Bibliothek befinden, müssen wir über eine import-Anweisung erst eine Wegbeschreibung hinterlegen.

Wie sie sehen können, kann aus der Klasse GeltungsbereichStart.java auf alle Variablen und Methoden aus der Klasse Geltungsbereich.java zugegriffen werden, die mit dem Schlüsselwort static deklariert wurden, ohne dass von der Klasse ein Objekt erzeugt werden muss.

Klassenvariable und Parameter in Methoden

Sehen wir uns ein weiteres Problem an.

Gedacht ist es, dass der Wert von zahl1 mit dem Parameter zahl1 initialisiert wird. Was passiert allerdings hier? Durch die Tatsache dass es eine Instanzvariable zahl1 und einen Parameter zahl1 gibt, sucht die Entwicklungsumgebung eine Deklaration von zahl1 innerhalb der Methode. Da dort keine Deklaration vorhanden ist, geht's in die nächsthöhere Ebene. Dort findet die Entwicklungsumgebung die Deklaration der Instanzvariablen zahl1. Somit steht für die Entwicklungsumgebung fest, dass diese Variablendeklaration für zahl1 steht. Dadurch wird innerhalb der Methode zahl1 mit dem Wert der Instanzvariablen zahl1 initialisiert. Somit ändert sich der Wert nicht.

Da dies allerdings nicht so gedacht ist, müssen wir dafür sorgen, dass die Entwicklungsumgebung erkennt, dass links vom Zuweisungsoperator die Instanzvariable verwendet werden soll und rechts vom Zuweisungsoperator die Parametervariable zahl1 verwendet werden soll. Die einfachste Methode dies zu ändern wäre offensichtlich, die Parametvariable umzubenennen. Aber damit könnten wir an dieser Stelle nicht's neues lernen, deshalb lernen wir hier an dieser Stelle das Schlüsselwort this kennen. Mit dem Schlüsselwort this erreichen wird, dass einer Methode unumstößlich mitgeteilt wird, dass es sich bei der Variable um die Instanzvariable handelt. In folgendem Quelltextauszug sehen Sie den gleichen Programmablauf mit der Ausnahme, dass innerhalb der Methode die links vom Zuweisungsoperator befindliche Variable mit this. angesprochen wurde.

Wie sie sehen können, erkennt die Entwicklungsumgebung nun, dass es sich bei this.zahl1 um die Instanzvariable handelt. Aus diesem Grunde verwendet die Entwicklungsumgebung nun den Parameterwert von zahl1 um diesen der Instanzvariablen zuzuweisen.

Übersicht

Lokale Variablen Instanzvariablen Klassenvariablen
Deklaration Innerhalb einer Methode/des Konstruktors oder als Parameter. Innerhalb einer Klasse, aber ausserhalb einer Methode/des Konstruktors. Innerhalb einer Klasse mit dem Schlüsselwort static, aber ausserhalb einer Methode/des Konstruktors.
Nutzung und Laufzeit Nutzung in Methoden um Zwischenergebnisse zu erhalten. Werden erzeugt, wenn die Methode aufgerufen wird und bei Verlassen der Methode werden sie zerstört. Eine Kopie der Variable wird für jedes neue Objekt erstellt, welches mit dem Schlüsselwort new erstellt wurde. Es wird zerstört, wenn keine Referenz aus irgendwelchem Objekt erfolgt. Eine Variable, welche mit allen Objekten geteilt wird. Diese wird beim Start des Programms erstellt und beim Beenden zerstört.
Initialisierung Muss vor Nutzung initialisiert werden Wird mit den default-Werten initialisiert. Wird mit den default-Werten initialisiert.
Geltungsbereich und Sichtbarkeit Gültig und sichtbar nur innerhalt der Methode/des Konstruktors, bzw. des Blockes, in welchen Sie deklariert wurden. Zugriffsmodifizieren können nicht verwendet werden. Können in allen Methoden und Konstruktoren der Klasse gesehen werden. Sichtbarkeit in anderen Klassen kann über Zugriffsmodifizierer erfolgen. Sie sind oft als private oder protected modifiziert. Oft gleich wie Instanzvariablen. Meistens verwendet bei der Deklaration von Konstanten.
nach oben Java4Beginners -- Seitenversion 1.0 -- Stand: 2017-05-16