Java™ und Objektorientierung | |
Java/OO | Druckversion |
BROCKHAUS: Variable
Programmierung: ein benannter Speicherplatz, der entweder einen - veränderlichen -
Wert besitzt oder leer (s. u.) ist.
Dabei handelt es sich nicht um einen physikalischen Speicherort, also einen bestimmten
Abschnitt im Arbeitsspeicher oder auf einem Datenträger,
sondern um einen logischen Speicherplatz, dessen tatsächlicher Ort vom Betriebssystem
jeweils nach Maßgabe der Erfordernisse zugewiesen wird. Es ist allerdings in
bestimmten Programmiersprachen möglich, den physikalischen Speicherort einer Variablen
abzufragen oder zu verändern.
Dies geschieht durch eine spezielle Variablenklasse, die sog. Pointer (Zeigervariablen).
Der Wert einer Variablen kann i. A. nicht beliebig gewählt werden, sondern ist - wie in der Mathematik - Element einer Wertevorrat genannten Menge. Dies können z. B. alle ganzen Zahlen zwischen 1 und 10 oder alle reellen Zahlen sein, aber auch Zeichenketten ({Müller, Meier, Schulze}) oder Wahrheitswerte (Wahr, Falsch) sind möglich. Anders als in der Mathematik spielt aber auch die Art, wie die Werte im Rechner repräsentiert werden, eine Rolle: Man muss z. B. zwischen einfacher und doppelter Genauigkeit oder Festkomma- und Gleikommavariablen unterscheiden. Art und Größe des Wertevorrats werden durch die Deklaration einer Variablen festgelegt. Dabei wird insbesondere der Variablentyp bestimmt, also der Datentyp der erlaubten Werte (z. B. Integer, Real, Double, Boolean, String, Pointer usw.).
Man kann mehrere Variablen kombinieren und diesem Konstrukt wiederum einen eigenen Namen zuweisen. Handelt es sich dabei um mehrere Variablen des gleichen Typs, spricht man auch von mehrdimensionalen Variablen, Feldern oder Arrays. Werden unterschiedliche Arten von Variablen zusammengefasst, nennt man dies meistens eine Struktur.
Nicht nur Anwendungsprogramme, auch Betriebssysteme können Variablen besitzen. Windows kennt u. a. die Systemvariablen "Path", "ComSpec" und "OS".
Eine (Java-)Variable zeichnet sich durch folgende Kriterien aus:
Name | Der Name kennzeichnet die Variable eindeutig. Keine zweite Variable in derselben Umgebung (Methode, Block, Klasse, ...) darf gleich heissen. (Zur Laufzeit eines Programmes entspricht der Name einer (virtuellen) Adresse im System.) |
Datentyp | Jede Variable hat einen Wertebereich, einen sogenannten
Datentyp. Aus diesem "Wertebereich" können die Werte der Variable
sein. Es ist so nicht möglich, einer Variable vom Typ int
(ganze Zahl) einen String (Zeichenkette) zuzuordnen.
In JAVA gibt es zwei Kategorien von Datentypen: a) die primitiven Datentypen (boolean, char, byte, short, int, long, float, double) und b) die Klassen. Jede Klasse kann als Datentyp für eine Variable angesehen werden. Daher werden Klassen und Interfaceds auch Types genannt. Die Werte für diese Variable sind dann die Objekte der Klasse. Wenn wir einer Variable einen Datentyp zuordnen, sprechen wir von Deklaration. Eine Deklaration ist eine Anmeldung des Datentyps der Variable vor der ersten Wertzuweisung |
Wert | Sobald eine Variable definiert ist, hat sie
einen Wert. Die Variable kann nur Werte aus dem Definitionsbereich
(von ihrem Datentyp) annehmen. Werte werden entweder explizit definiert: siehe Literale oder sie werden durch einen Ausdruck bestimmt. Somit ist eine Variable nicht wie in der Mathematik ein Platzhalter für einen bestimmten Wert, sondern ein Behälter für beliebige Werte aus der Grundmenge. |
In folgendem Beispiel kommen die Variablen x vom Typ int (ganze Zahl) und d vom Typ Date (Kalenderdatum) vor.
JAVA-Code | Name | Datentyp | Wert | Beschreibung |
x | x | ? | ? | Die eben benannte Variable x hat weder einen Datentyp noch einen Wert. |
int x; | x | int | ? | Die jetzt deklarierte Variable x hat den Datentyp int (ganze Zahl). Der Wert ist noch nicht gesetzt und darf, sofern es sich um eine lokale Varibale in einer Methode handelt, auch nicht verwendet (ausgelesen) werden. Handelt es sich hingegen um ein Attribut (einer Instanz), so wird der Wert mit 0 (Null bzw. null) initialisiert. Zur Laufzeit wird vom System auch eine (virtuelle) Speicheradresse vergeben. |
x = 5; | x | int | 5 | Mit einer Zuweisung erhält die Variable einen definierten Wert. Jetzt darf die Variable auch ausgelesen werden (z. B. y = x;). |
Date d; | d | Date | ? | Diese Deklaration erzeugt eine Variable vom Datentyp Date. In JAVA sind alle Klassen gleichzeitig Datentyp. Die Deklaration verläuft gleich wie im Falle eines "primitiven Datentyps". Der Name der Variablen ist d. Einen Wert hat die Variable (noch) nicht. |
d = new Date(); | d | Date | (s. unten) | Mit dieser Definition geschehen zwei Dinge. 1. Ein Objekt (Instanz der Klasse Date) wird generiert (s. unten). 2. Der Variablen d wird als Wert eine Referenz (Pointer, Zeiger) auf das neue Objekt vergeben. (s. weiter unten). |
d = new Date(); | * | Date | "<Date>:" | Zu 1: Zunächst wird für das Objekt Speicherplatz geschaffen
(alle in der Tabelle mit einem roten
* markierten Attribute).
Das neue Objekt hat keinen für den/die Programmierer/in sichtbaren Namen! Erst durch die Zuweisung (s. u.) kann via die Variable d auf das neue Objekt zugegriffen werden. |
*.day | int | 30 | *.month | int | 9 |
*.year | int | 1999 | ||
d = new Date(); | d | Date | * --> "30.9.99" | Zu 2: Jetzt wird der Referenz d das neu generierte Objekt (*) zugewiesen. |
Die Werte von Variablen wurden in der Tabelle manchmal mit ? bezeichnet. Das heißt, die Variablen haben noch keine gültigen Werte. Der Compiler setzt die Variablen auf einen "Defaultwert". Die Variablen dürfen aber im aktuellen Kontext (Namespace) nicht verwendet werden. Jeder Variablen muss vor ihrem ersten Lesezugriff ein Wert zugewiesen worden sein, sonst gibt es eine Fehlermeldung.
In JAVA kommen Variablen in verschiedenem Kontext zum Einsatz:
Attribute | Variable, die innerhalb von Klassen, aber außerhalb von Methoden oder Konstruktoren deklariert werden, heißen (sofern nicht static) Attribute. Diese erhalten ihren Speicherplatz, sobald ein Objekt der entsprechenden Klasse (oder einer Subklasse) generiert wird (new). Attribute erhalten beim Generieren (sofern nicht anders definiert) ihren Defaultwert (siehe unten). |
Klassenvariable | Mit static markierte Felder sind Klassenvariable. Diese Variablen haben einen festen Speicherplatz und können von allen Instanzen (Objekten) dieser Klasse verwendet werden. Auch dürfen die statischen Methoden (Klassenfunktionen) auf diese Variablen zugreifen. Egal wieviele Objekte es gibt, die Klassenvariable kommt nur einmal vor und ist in diesem Sinne "global". In einer Interface-Deklaration braucht das Schlüsselwort static nicht angegeben zu werden. Die Variable erhält ihren Speicherplatz, sobald der Classloader die Klasse in die virtuelle Maschine lädt. Klassenvariable erhalten - sofern keine Definition angegeben ist - automatisch den Defaultwert (siehe unten). |
Arraywerte | Arrays (auch Felder genannt) bestehen aus Variablen desselben Datentyps. Wenn ein Array generiert wird (new A[<size>]) erhalten alle Elemente Speicherplatz und ihren Defaultwert (siehe unten). Objektreferenzen werden mit null initialisiert. |
Parameter | Methoden und Konstruktoren können mit einer formalen Parameterliste (auch Argumentliste) versehen sein. Diese Variablen sind nur innerhalb der Methode sichtbar und leben nur solange (auf dem Stack) wie sich der ausführende Thread (Programmzeiger) innerhalb der Methode oder des Konstruktors befindet. Parameter haben keine Defaultwerte. Die Werte werden beim Aufruf der Methode oder des Konstruktors vom aufrufenden Programmteil übergeben. Genauer: Das aufrufende Programm wertet die Argumente aus, und die Werte (z. B. Zahlen, Referenzen) werden auf den Stack geschrieben. |
Exception-Handler Parameter | Jeder Exceptionhandler (catch(Exception e) {...}) enthält ein Argument des Datentyps der entsprechenden Exception (Ausnahme). Sobald die Exception auftritt, wird ein Objekt der entsprechenden Klasse generiert. Dieses Objekt wird dem Argument übergeben und kann innerhalb des catch-Blocks benutzt werden. |
Lokale Variable | Jeder Block (auch namenlose Blöcke) kann lokale Variablen deklarieren.
Wichtig: Die lokalen Variablen erhalten keinen Defaultwert. Sie müssen explizit definiert werden (z. B. : int x; x = 7;). |
Wie oben erwähnt erhalten Attribute und Klassenvariablen ihren
Defaultwert (sofern keine explizite Definition vorgenommen wurde).
In folgender Tabelle sind die Defaultwerte der JAVA-Datentypen
angegeben.
Datentyp | Defaultwert |
boolean | false |
byte | 0 |
char | 0-Zeichen (Unicode \u0000) |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 (oder gleichwertig: 0.0D) |
Klasse | null (nicht 0) bedeutet, dass die Referenz auf kein Objekt "zeigt". |
[ ] array | null bedeutet, dass der array noch nicht definiert wurde. |