Variablen
🚧 | Diese Seite befindet sich in Bearbeitung | 🚧 |
In der Programmierung erstellen, verändern und verarbeiten wir sehr viele unterschiedliche Daten. Um vor allem den Überblick über veränderliche Datenbestände nicht zu verlieren kann es nützlich sein eigene Daten zu Hilfszwecken abzulegen oder sogar zu erstellen.
Variablen/Konstanten deklarieren
Das reservieren des Speichers für einen Wert nennen wir Deklarieren. Damit sagen wir aus, dass wir gerne einen Speicherplatz für einen Gewissen Typ, also von gewisser Größe, benötigen um in Zukunft dort Werte ablegen zu können. In Java deklarieren wir Variablen wiefolgt:
// Deklarieren einer Variable
Datentyp bezeichnerImLowerCamelCase;
// Deklarieren einer Konstante
static final Datentyp BEZEICHNER_IM_UPPER_SNAKE_CASE;
Zu beachten ist hierbei die Wahl eines geeigneten Bezeichners. Für Konstanten soll insbesondere darauf geachtet werden, dass die Inhalte der Konstante nicht in dem Bezeichner vorkommen. Siehe Bedeutungslose Konstanten.
Variablen/Konstanten initialisieren
Legen wir zum ersten Mal Daten in einer deklarierten Variable ab, reden wir von einer Initialisierung. Alle weiteren Ablagen sind dann Zuweisungen. Hierbei ist zwischen primitiven Datentypen und Referenzdatentypen zu unterscheiden, da es zwischen diesen kleine Unterschiede gibt.
Konstanten können zudem nur Initialisiert, danach aber durch das Schlüsselwort final
nicht mehr erneut zugewiesen werden.
Bei primitiven Datentypen
Die Initialisierung für primitive Datentypen ist identisch zu der Zuweisung. Hierbei wird also einfach direkt der Wert der Variablen übergeben, ohne ein neues Objekt zu erstellen. Achtung: Es kann hier bereits zur Typkonvertierung kommen. Das sieht dann wiefolgt aus (Bezeichner aus vorherigem Beispiel):
// Initialisierung einer Variable
// Der Wert ist hierbei dem deklarierten Typ entsprechend, Zahlen für Integer, Gleitkommazahlen für Floats, ...
bezeichnerImLowerCamelCase = Wert;
// Eine Zuweisung nach der Initialisierung
bezeichnerImLowerCamelCase = AndererWert;
// Initialisierung einer Konstante
// Hier gibt es also keine Unterschiede, außer, dass spätere Zuweisungen nicht mehr erlaubt werden durch das final in der Deklaration.
BEZEICHNER_IM_UPPER_SNAKE_CASE = Wert;
// Eine erneute Zuweisung führt zu Fehlern
BEZEICHNER_IM_UPPER_SNAKE_CASE = AndererWert;
Bei Referenzdatentypen
Bei der Initialisierung von Referenzdatentypen wird nicht (und kann auch nicht) direkt der Wert zugewiesen. Stattdessen wird ein Konstruktor aufgerufen, der das zu speichernde Objekt dann zurückgibt. Allerdings wird hier nicht das Objekt selbst, sondern nur die Referenz zu diesem Objekt gespeichert:
// Hier ist jetzt die Referenz gespeichert, nicht der Typ
bezeichnerImLowerCamelCase = new KlassenName(Typ AttributWert, ...);
// Zuweisung eines anderen Objekts
// Hier wird jetzt die Referenz durch die neue ersetzt.
bezeichnerImLowerCamelCase = anderesInstanziiertesObjekt;
Ausnahme: Strings
Strings selbst sind kein primitiver Datentyp sondern setzt sich aus Characters zusammen. Entsprechend wird dort nicht direkt der Wert gespeichert. Auch hier wird eine Referenz gespeichert. Das allerdings nur Intern. Das heißt insbesondere, dass Strings der einzige Referenzdatentyp in Java ist, der ohne Konstruktor initialisiert werden kann (die Klasse String stellt allerdings Konstruktoren bereit die verwendet werden können):
// Initialisierung eines Strings
bezeichnerImLowerCamelCase = "Ein neu initialisierter String";
// Neuzuweisung eines Strings
bezeichnerImLowerCamelCase = "Ein neu zugewiesener String";
Lokalität von Variablen
Variablen besitzen innerhalb der Programmstruktur unterschiedliche Lokalitäten. So sind Attribute Klassenweit verfügbar, ggf. sogar Paket oder Projektweit. Hierbei geht es immer darum wo sie deklariert werden, die Initialisierung spielt hierbei keine Rolle. Eine Variable oder Konstante ist immer nur in der Struktur und inneren verfügbar, in der sie deklariert wurde, nicht aber außerhalb.
Beispielhaft sind also die Variablen innerhalb einer Methode nur in dieser verfügbar. Ist in der Methode zusätzlich eine for-Schleife, so ist innerhalb der for-Schleife zusätzlich noch die Zählvariable dieser vorhanden. Außerhalb der Methode sind allerdings beide nicht verfügbar:
class Locality {
bool semiGlobal;
void method() {
semiGlobal = true;
bool local;
for (int inner = 0; inner < 10; inner++) {
semiGlobal = true;
local = true;
}
// Fehler, Java kennt inner nicht. Die Variable wurde nie (außerhalb von der for-Schleife) deklariert
inner = 10;
}
semiGlobal = true;
// Fehler, Java kennt local nicht. Die Variable wurde nie (außerhalb von method) deklariert
local = true;
}