Thema in Kurzform
Instanzvariablen sind in der gesamten Klasse verfügbar. Parameter- und lokale Variablen dagegen sind auf die Methode beschränkt, in der sie deklariert wurden.
Wir unterscheiden zwischen drei verschiedenen Variablen-Typen, die sich danach unterscheiden, wo sie im Code der jeweiligen Klasse deklariert werden. Der Ort, wo wir eine Variable erzeugen, hat nämlich entscheidenden Einfluss auf ihren Gültigkeitsbereich.
Es gibt noch einen weiteren Variablentyp, den wir aber erst im nächsten Kapitel kennenlernen: die statische Klassenvariable.
Es ist am besten, wenn wir uns das Prinzip einmal konkret anhand einer kleinen Java-Klasse anschauen:
public class Fahrzeug {
// Instanzvariablen:
private String bezeichnung;
private double geschwindigkeit;
// Konstruktor mit 2 Parameter-Variablen:
public Fahrzeug(String bezeichnungP, double geschwindigkeitP){
bezeichnung = bezeichnungP;
geschwindigkeit = geschwindigkeitP;
}
// Methode mit einer Parameter-Variablen und
// einer lokalen Variablen:
public double getFahrtdauer(int fahrtstrecke){
double zeit = (fahrtstrecke / geschwindigkeit) * 60;
return zeit;
}
}
Folgende Variablen kommen in dieser Beispielklasse vor:
Man könnte Parametervariablen und lokale Variablen auch "Methoden-Variablen" nennen, da sie ja fest zu den Methoden gehören, in denen sie erzeugt wurde und auch nur dort benutzbar bzw. sichtbar sind
Es gibt in der Verwendung von Parametervariablen und lokalen Variablen aber einen feinen Unterschied: Auf Parametervariablen können in der gesamten Methode zugegriffen können. Lokale Variablen dagegen innerhalb "ihrer" Methode erst in den Code-Zeilen nach der Initialisierung (also nachdem sie einen passenden Wert erhalten haben).
Man könnte Parametervariablen und lokale Variablen auch "Methoden-Variablen" nennen, da sie ja fest zu den Methoden gehören, in denen sie erzeugt wurde und auch nur dort benutzbar bzw. sichtbar sind
Es gibt in der Verwendung von Parametervariablen und lokalen Variablen aber einen feinen Unterschied: Auf Parametervariablen können in der gesamten Methode zugegriffen können. Lokale Variablen dagegen innerhalb "ihrer" Methode erst in den Code-Zeilen nach der Initialisierung (also nachdem sie einen passenden Wert erhalten haben).
Oder anders gefragt: Welchen Wert haben Variablen, wenn sie nicht initialisiert werden? Haben Sie überhaupt einen Wert?
Eigentlich verhält es sich damit ganz einfach. Wir müssen aber zwischen Instanzvariablen und lokalen Variablen unterscheiden.
Wenn eine Instanzvariable vom Programmierer deklariert, aber (noch) nicht initialisiert wird, erhält diese dennoch automatisch einen Standardwert zugewiesen. Dieser Wert unterscheidet sich je nach Datentyp:
Datentyp | Standardwert |
---|---|
Objekttyp (z.B. String) | null |
byte, short, int, long | 0 |
float, double | 0.0 |
boolean | false |
char | Nullzeichen \u0000 |
Die Konsequenz daraus ist praktisch: Wir können auf eine Instanzvariable nach ihrer Deklarierung nicht nur überall im Klassen-Code zugreifen. Sie ist außerdem sofort "einsatzbereit".
Bei diesen Variablen-Typen ist das anders. Lokale Variablen erhalten nämlich nach der Erzeugung/ Deklaration keinen Standardwert zugewiesen. Wir können diese daher erst dann benutzen, nachdem sie explizit einen Wert zugewiesen bekommen haben.
Der folgende Code verursacht deshalb einen Compiler-Fehler:
public void eineMethode(){
String lokaleVariable;
System.out.println(lokaleVariable); //Fehler!
}
Die lokale Variable bekommt keinen Standardwert, das arme Ding! Somit können wir sie auch nicht einsetzen. Während eine Instanzvariable standardmäßig einen Null-Wert hat (siehe Tabelle), den wir auch am Bildschirm ausgeben könnten, hat eine lokale Variable ohne Initialisierung überhaupt nichts! Verstehen Sie jetzt, warum Null nicht Nichts ist? :-)
Mit Gültigkeitsbereich einer Variablen ist gemeint, wo im Quellcode der Klasse wir diese einsetzen können. Im Englischen heißt das scope, was die Sache gut beschreibt, nämlich den "Spielraum" bzw. den möglichen "Aktionsradius" einer Variablen.
Wie wir wissen, können wir eine Instanzvariable überall im Code einer Klasse einsetzen. Auf Parameter-Variablen können wir schon in der gesamten Methode zugreifen.
Spannend wird es bei den lokalen Variablen. Diese können nach ihrer Deklaration einen Gültigkeitsbereich prinzipiell für den Rest der Methode haben, in der sie erzeugt wurden. "Können"? Ja, denn das ist nicht immer der Fall. Oftmals kann auf eine Variable nämlich nur auf einen Teilbereich der Methode zugegriffen werden.
Sehen wir uns das mal in einem Beispiel an: Was meinen Sie ist der Gültigkeitsbereich der Variablen strafzettel innerhalb der Methode blitzer()?
public String blitzer(){
if(geschwindigkeit>120){
String strafzettel; //die lokale Variable
strafzettel = "Zu schnell! Gemessene Geschwindigkeit " + geschwindigkeit;
return strafzettel;
}
else{
//
}
}
Die Variable strafzettel ist nicht überall innerhalb der Methode gültig, sondern nur in den Zeilen 4-7 zwischen den beiden geschweiften Klammern { und }. Das ist nämlich der Block des if-Bereichs. Eben dieser Bereich ist der Scope der Variable, ihr Gültigkeitsbereich, und den darf sie nicht verlassen! Ein Zugriff auf die Variable von außerhalb ist nicht möglich.
Java Basics
[Java einrichten] [Variablen] [Primitive Datentypen] [Operatoren] [if else] [switch-case] [Arrays] [Schleifen]
Objektorientierung
[Einstieg] [Variablen ] [Konstruktor] [Methoden] [Rekursion] [Statische Member] [Initializer] [Pass-by-value] [Objektsammlungen] [Objektinteraktion] [Objekte löschen]
Klassenbibliothek
[Allgemeines] [String ] [Math] [Wrapper] [Scanner] [java.util.Arrays] [Date-Time-API]
Vererbung
[Einstieg Vererbung] [Konstruktoren bei Vererbung ] [Der protected Zugriffsmodifikator] [Abstrakte Klassen und Methoden] [Polymorphie in Java] [Typumwandlung] [Die Klasse Object] [Die toString()-Methode] [Objekte vergleichen] [Was ist ein Interface?]