Gueltigkeit und Sichtbarkeit
Dieses Kapitel basiert auf dem Arbeitsblatt zu "Sichtbarkeit und Lebensdauer von Variablen". Es verbindet drei Felder, die in Java regelmaessig zu Fehlern fuehren:
- scope (Sichtbarkeit)
- extent (Lebensdauer)
- Namensueberschattung und Vererbungskontexte
Zwei Grundbegriffe
Das Arbeitsblatt trennt sehr klar:
- Sichtbarkeit (scope): Wo im Quelltext darf auf eine Variable zugegriffen werden?
- Lebensdauer (extent): Wann existiert die Variable im Speicher?
Eine Variable kann also sichtbar sein, aber schon nicht mehr existieren, oder existieren, aber ausserhalb des aktuellen Scopes liegen.
Lokale Variable, Parameter, Instanzvariable
In der Praxis kommen drei Typen staendig vor:
- lokale Variablen innerhalb einer Methode
- Parameter der Methode
- Instanzvariablen (Attribute der Klasse)
Wenn Namen mehrfach verwendet werden, entsteht Ueberschattung.
Namensueberschattung und this
Das Arbeitsblatt zeigt klassische Beispiele:
class X {
private int a;
public void setA(int a) {
this.a = a;
}
}
Ohne this wuerde der Parameter a sich selbst zugewiesen werden. Mit this.a greifst du explizit auf das Attribut zu.
Dasselbe gilt, wenn in einer Methode eine lokale Variable denselben Namen traegt wie ein Attribut.
Zugriffsmodifier und Sichtbarkeit
Das Arbeitsblatt knuepft an OOP-I an:
private: nur in der eigenen Klasseprotected: in Klasse und Subklassen (plus package-Regeln)public: allgemein sichtbar
Die Wahl des Modifiers bestimmt, welche Stellen im Programm ueberhaupt auf welche Daten zugreifen duerfen.
Sichtbarkeit in Vererbungssituationen
Das Arbeitsblatt enthaelt Aufgaben mit Klassenhierarchien (KlasseA, KlasseB, KlasseC) und ueberschriebenen Methoden.
Typische Fragen dabei:
- Welche Variable ist in
methode1sichtbar? - Welche in
methode2? - Welche Ausgabe entsteht in
mainund warum?
Die richtige Loesung erfordert immer die Kombination aus:
- statischem Typ der Referenz
- dynamischem Typ des Objekts
- scope-Regeln innerhalb der Methode
Wertebelegungstabellen als Technik
Das Arbeitsblatt fordert explizit Tabellen, in denen pro Programmschritt der Variablenwert notiert wird. Diese Technik ist sehr wirksam bei verschachtelten Methodenaufrufen.
Empfehlung:
- Zeilennummer/Schritt notieren
- relevante Variablen als Spalten
- nach jedem Sprung in Methode Werte aktualisieren
- Rueckspruenge und Rueckgabewerte markieren
Gerade bei gleichnamigen Variablen auf verschiedenen Ebenen verhindert das viele Denkfehler.
Beispielmuster: statisch vs. nicht-statisch
Das Blatt enthaelt auch Aufgaben mit statischen Variablen in Methodenketten.
Wichtige Unterscheidung:
staticgehoert zur Klasse- Instanzvariablen gehoeren zu konkreten Objekten
Das hat unmittelbare Folgen fuer Sichtbarkeit und Lebensdauer:
- Klassenvariablen leben, solange die Klasse geladen ist.
- lokale Variablen leben nur waehrend des Methodenaufrufs.
Haeufige Fehler in diesem Kapitel
thisbei Ueberschattung vergessen Attribut wird nicht wie erwartet geaendert.- Lebensdauer lokaler Variablen unterschaetzt Nach Methodenende sind sie weg.
- Sichtbarkeit mit Erreichbarkeit verwechselt
Eine Referenz kann sichtbar sein, aber
nullenthalten. - Vererbte Member falsch eingeschaetzt
privateder Oberklasse ist in Subklasse nicht direkt sichtbar. - statische und instanzbezogene Daten gemischt Fuehrt zu schwer nachvollziehbarem Zustand.
Methodische Loesestrategie fuer Sichtbarkeitsaufgaben
- Marker fuer jede Variable setzen: lokal, Parameter, Instanz, statisch.
- Bei Namensgleichheit sofort notieren, welche Ebene gemeint ist.
- Vor jedem Methodenaufruf aktuellen Zustand protokollieren.
- Bei Rueckkehr aus Methode Rueckgabewert und Seiteneffekte trennen.
- Erst danach Ausgabezeilen auswerten.
Diese Reihenfolge ist deutlich robuster als "im Kopf improvisieren".
Beispiel zur Klarstellung
class Test {
private int k;
public void methode1(int i) {
k = i;
}
public int methode3(int i) {
int k = i;
return i * k;
}
}
Hier gibt es zwei k:
- Attribut
this.k - lokale Variable
kinmethode3
Diese sind verschieden. Die lokale Variable ueberschattet das Attribut nur innerhalb der Methode.
Uebungsaufgaben zur Vertiefung
- Analysiere ein kleines Programm mit drei gleichnamigen Variablen (
a) auf unterschiedlichen Ebenen. - Erstelle eine vollstaendige Wertebelegungstabelle fuer den Ablauf.
- Schreibe ein Beispiel, in dem
this.anoetig ist. - Schreibe ein Beispiel mit
static int x, das Methodenaufrufe ueber mehrere Zweige beeinflusst. - Formuliere fuer jede Variable explizit: scope, Lebensdauer, Speicherort.
Praxishinweise fuer sauberen Code
- Namen nicht unnoetig mehrfach verwenden.
- Kurze Methoden reduzieren Scope-Komplexitaet.
- Seiteneffekte deutlich benennen (
set...,update...). - Bei kompliziertem Ablauf mit Debugger oder Tabelle arbeiten.
privateals Standard, Sichtbarkeit nur bei Bedarf oeffnen.
Zusammenfassung
Das Arbeitsblatt liefert die Kernbotschaft sehr deutlich:
- Viele "mystische" Java-Fehler sind in Wahrheit Scope- und Lebensdauerfragen.
- Wer Sichtbarkeit und Wertebelegung systematisch analysiert, loest solche Aufgaben reproduzierbar.
- Diese Kompetenz ist Voraussetzung fuer sichere Arbeit mit Vererbung, Polymorphie und groesseren Projekten.
Scope-Analyse als feste Methode
Das Arbeitsblatt zeigt, dass viele Aufgaben nur dann sicher loesbar sind, wenn Scope und Lebensdauer explizit verfolgt werden. Eine robuste Methode besteht aus vier Schritten:
- Alle Variablen deklarationsnah markieren (lokal, Parameter, Instanz, statisch).
- Fuer jede Methode den sichtbaren Bereich notieren.
- Bei jedem Aufruf einen neuen Kontext aufmachen.
- Bei Rueckkehr den Kontext sauber schliessen.
Das ist im Prinzip ein manuelles Stack-Modell.
Namensgleichheit gezielt vermeiden
Ueberschattung ist in Java erlaubt, aber oft unnoetig riskant. Besonders in Lerncode gilt:
- Parameter und Attribute nicht gleich benennen, wenn
thisnoch unsicher ist. - Lokale Variablen mit klarer Rolle benennen (
summe,count,index).
Wenn Namensgleichheit doch gebraucht wird, muss this konsequent genutzt werden.
Lebensdauer konkret im Methodenaufruf
Beispielmuster:
public int methode3(int i) {
int k = i;
return i * k;
}
- Parameter
ilebt waehrend des Aufrufs. - Lokale Variable
klebt ebenfalls nur waehrend dieses Aufrufs. - Instanzvariablen leben so lange wie das Objekt.
Diese Unterscheidung ist entscheidend fuer das Verstaendnis von Nebeneffekten.
Statische Variablen im Ablauf verfolgen
Das Blatt nutzt Aufgaben mit static-Feldern und mehreren Methoden. Dabei helfen zwei Regeln:
- Eine statische Variable ist pro Klasse genau einmal vorhanden.
- Jeder Aufruf kann denselben globalen Wert veraendern.
Deshalb sind statische Felder in Aufgaben mit rekursionsartigen Aufrufketten besonders fehleranfaellig.
Beispiel fuer Ueberschattung in einer Klasse
class Demo {
private int a = 10;
public void setA(int a) {
this.a = a;
}
public void test() {
int a = 3;
System.out.println(a); // lokale Variable
System.out.println(this.a); // Attribut
}
}
Dieses minimale Beispiel deckt den Kern vieler Blattfragen ab.
Wertebelegungstabellen richtig fuehren
Damit Tabellen wirklich helfen, sollten sie standardisiert sein:
Spalten:
- Programmschritt oder Zeilennummer
- aktive Methode
- lokale Variablen
- Instanzvariablen
- statische Variablen
Bei jedem Methodenwechsel wird eine neue Zeile geschrieben. So bleiben Spruenge und Rueckkehrpunkte nachvollziehbar.
Typische Fehlmuster bei Sichtbarkeitsaufgaben
- Attributwert mit lokalem Wert verwechselt.
- Annahme, dass
privatein Subklasse direkt sichtbar ist. - Vergessen, dass
staticklassenweit geteilt ist. - Rueckgabewert mit Seiteneffekt gleichgesetzt.
- Variablenzustand nur am Ende statt schrittweise betrachtet.
Uebungspaket fuer Vertiefung
- Schreibe eine Klasse mit Attribut
x, MethodesetX(int x)und lokalerxin zweiter Methode. - Erstelle Tabelle fuer einen Ablauf mit drei Methodenaufrufen.
- Ergaenze eine statische Variable und wiederhole die Analyse.
- Fuehre Vererbung ein und pruefe Sichtbarkeit von
privatevsprotected. - Begruende jede Ausgabezeile schriftlich.
Diese Reihe entspricht dem Aufgabencharakter des Arbeitsblatts.
Debugging-Hinweise fuer Praxiscode
Wenn unerwartete Werte auftauchen:
- Suche nach Namensgleichheit zwischen Parametern und Attributen.
- Pruefe, ob
thisfehlt. - Pruefe, ob statische Felder unerwartet mitveraendert werden.
- Pruefe, ob eine Methode Werte nur lokal aendert statt am Objekt.
- Setze gezielte Log-Ausgaben an Methodenanfang und -ende.
Bewertungsraster fuer Lernkontrollen
- Scope korrekt erkannt.
- Lebensdauer korrekt beschrieben.
- Ueberschattung korrekt aufgeloest.
- Statische und instanzbezogene Werte getrennt analysiert.
- Ausgaben schrittweise und nachvollziehbar begruendet.
Warum dieses Kapitel so wichtig ist
Viele spaetere Probleme in OOP-II wirken auf den ersten Blick "kompliziert", sind aber in Wahrheit Scope-/Sichtbarkeitsfehler. Wer dieses Kapitel sicher beherrscht, kann Polymorphie- und Vererbungsaufgaben deutlich stabiler loesen.
Abschluss
Das Arbeitsblatt liefert mit Sichtbarkeit und Lebensdauer ein Analysewerkzeug, das weit ueber Einsteigeraufgaben hinausgeht. Die konsequente Tabellenmethode macht komplexe Programmablaeufe transparent und reduziert Fehlinterpretationen drastisch.
Abschlussaufgabe zu Scope und Lebensdauer
Erstelle ein kleines Programm mit drei Klassen, in dem absichtlich gleichnamige Variablen auf verschiedenen Ebenen vorkommen.
Aufgabe:
- Fuehre das Programm aus und notiere alle Ausgaben.
- Erstelle eine Wertebelegungstabelle ueber den gesamten Ablauf.
- Markiere fuer jede Variable Scope und Lebensdauer.
- Ersetze anschliessend alle kritischen Namensgleichheiten durch bessere Namen und vergleiche die Lesbarkeit.
Diese Aufgabe macht den Kern des Arbeitsblatts praxisnah sichtbar.
Pruefungsnahe Kurzfragen
- Definiere Scope und Lebensdauer in je einem Satz.
- Wann verdeckt eine lokale Variable ein Attribut?
- Welche Rolle spielt
thisbei Namensgleichheit? - Warum sind Wertebelegungstabellen bei komplexen Aufrufen hilfreich?
Diese Fragen pruefen direkt die Analysefaehigkeit aus dem Arbeitsblatt.
Weiterfuehrende Praxisaufgabe
Analysiere ein kleines Programm mit drei Methoden, einer Klassenvariable und zwei Instanzvariablen.
Arbeitsauftrag:
- Zeichne den Aufrufverlauf als Sequenz.
- Erstelle eine Wertebelegungstabelle fuer jeden Methodeneintritt und -austritt.
- Markiere in jeder Zeile, welche Variablen sichtbar sind.
- Notiere, wann lokale Variablen den Scope verlassen.
Abschlussfrage:
- Welche konkrete Codeaenderung reduziert Verwechslungsgefahr am staerksten (Umbenennen, Aufteilen, Kapseln)?
Diese Praxisaufgabe verbindet Scope-Theorie mit konkreter Debug-Arbeit.
Mini-Reflexion
Wenn in einer Aufgabe ein Wert "unerwartet" ist, sollte zuerst nicht der Algorithmus verdaechtigt werden, sondern die Sichtbarkeitslage: Welche Variable mit gleichem Namen ist gerade aktiv, und welche wurde tatsaechlich geaendert? Diese Denkweise spart in Scope-Aufgaben sehr viel Zeit.
Zusatzaufgabe
Schreibe eine Methode, in der ein Parameter denselben Namen wie ein Attribut hat, und dokumentiere den Unterschied zwischen Zugriff mit und ohne this. Fuehre danach dieselbe Methode mit umbenannten Parametern aus und vergleiche Lesbarkeit und Fehlerrisiko.
Schlussgedanke
Scope-Probleme wirken oft unsichtbar, bis ein Wert "unerwartet" kippt. Wer systematisch in Kontexten denkt (Klasse, Objekt, Methode, Block), loest solche Fehler deutlich schneller und mit weniger Trial-and-Error.
Als Faustregel gilt: Je mehr Namensgleichheiten und statische Nebenwirkungen in einem Codeabschnitt auftreten, desto konsequenter sollte mit Tabellen, klaren Variablennamen und kurzen Methoden gearbeitet werden.
