Fachkonzept - Lokale Variablen
Schmierzettel für Objekte
Man kann Variablen an unterschiedlichen Stellen definieren. Dazu gehört z.B. die Definition als Attribut, als Parameter oder als lokale Variable in einer Methode. Attribute benutzt man, wenn man Eigenschaften eines Objektes speichern möchte. Parameter benutzt man, wenn ein Objekt zur Ausführung einer Methode noch weitere Informationen benötigt. Möchte man dagegen - vergleichbar mit einem Schmierzettel - nur mal kurz eine Information zwischenspeichern, verwendet man lokale Variablen in Methoden. Gerade bei Anfängern beobachtet man öfter, dass Information, die von der Logik eigentlich in einer lokalen Variablen gespeichert werden sollten, als Attribut gespeichert werden. Dies sollte man vermeiden, da das die Struktur der Klassen unnötig verkompliziert und leicht für logische Fehler bei der Programmierung sorgt.
Attribute und lokale Variablen in Java
Java geht mit Attributen und lokalen Variablen unterschiedlich um. Während Attribute automatisch initialisiert werden, muss dies bei lokalen Variablen explizit erfolgen.
Die folgende Klasse lässt sich compilieren:
class Demo {
int x;
void tuWas() {
x = x + 1;
}
}
Attribute mit Zahlentypen werden in Java automatisch mit 0
initialisiert.
Allerdings ist es besserer Stil die Initialisierung auch in solchen
Fällen explizit im Konstruktor vorzunehmen, um zu dokumentieren,
dass man die Initialisierung mit 0
wünscht und nicht
einfach vergessen hat.
Die folgende Methode dagegen lässt sich nicht compilieren. Man erhält die Fehlermeldung: "variable y might not have been initialized", da die Variable noch keinen Wert hat.
void tuNochWas() {
int y;
y = y + 1;
}
Ähnlich verhält es sich in diesem Beispiel:
void tuNochWasTolles() {
int z;
if(x == 42) {
z = 0;
}
z = z + 1;
}
Auch hier meldet der Compiler, dass z
eventuell
noch nicht initialisert wurde, da nicht sichergestellt ist,
dass die Anweisung in der if-Anweisung ausgeführt wird.
Parameter als lokale Variablen
Parameter sind eigentlich auch lokale Variablen. Üblicherweise greift man auf diese allerdings nur lesend zu. Die folgende Methode lässt sich also nicht compilieren, da es dann zwei mal die gleiche Variable gäbe.
void doppelteDefinition(int a) {
int a;
}
Sichtbarkeitsbereich
Attribute sind überall innerhalb einer Klasse sichtbar. Parameter kann man innerhalb einer Methode verwenden, sonstige lokale Variablen nur innerhalb des Blocks, in dem sie definiert wurden.
class MeineKlasse {
int attribut;
void sichtbar(int parameter) {
int lokal1;
if(attribut == 0) {
attribut = parameter;
int lokal2 = 42;
}
lokal1 = lokal2; // -> Fehlermeldung, da es lokal2 hier nicht gibt.
}
}
Oft möchte man z.B. Parameter und Attribute gleich benennen, da z.B. der Wert des Parameters im Attribut gespeichert werden soll:
class Hund {
String name;
void umbenennen(String name) {
name = name;
}
}
Die Klasse lässt sich zwar compilieren, wird aber nicht wie gewünscht funktionieren. Wenn ein Variablenname als Attribut und lokale Variable vorkommt, wird immer die lokale Variable benutzt. Im obigen Beispiel wird also der als Parameter übergebene Name wieder im Parameter gespeichert. Das Attribut wird nicht verändert. Man muss dann entweder eine der Variablen umbenennen oder explizit auf das eigene Attribut zugreifen:
class Hund {
String name;
void umbenennen(String name) {
this.name = name;
}
}
this
bezeichnet in Java immer das eigene Objekt.
Durch this.attribut
greift man auf das eigene Attribut zu,
durch this.methodenname()
ruft man eine eigene Methode auf.
In manchen Programmiersprachen muss dies immer angegeben werden.
In Java muss man dies nur in selteneren Fällen wie z.B. in der dargestellten Methode tun.