Hallo, Amigo! Ich möchte dir etwas über die interne Struktur von Variablen erzählen. Wie du ja schon weißt, ist jede Variable mit einem Speicherbereich verknüpft, in dem ihr Wert gespeichert wird.

„Ja. Du hast mir letztes Mal davon erzählt.“

„Prima. Gut, dass du dich daran erinnerst. Dann also weiter.“

„Alle zusammengesetzten Typen bestehen aus einfacheren. Und die wiederum bestehen aus noch einfacheren. Bis wir schließlich bei den primitiven Typen ankommen, die nicht weiter vereinfacht werden können. So werden sie genannt: primitive Typen. Zum Beispiel ist int ein primitiver Typ, während String ein zusammengesetzter Typ ist, der seine Daten als eine Tabelle von Zeichen speichert (wobei jedes Zeichen ein primitiver Typ char ist).“

„Interessant. Erzähl mir mehr.“

„Zusammengesetzte Typen werden durch die Gruppierung einfacher Typen gebildet. Wir nennen solche Typen Klassen. Wenn wir eine neue Klasse in einem Programm definieren, deklarieren wir einen neuen zusammengesetzten Datentyp. Seine Daten sind dann entweder andere zusammengesetzte Typen oder primitive Typen.“

Java-Code Beschreibung
public class Person
{
   String name;
   int age;
}
Ein neuer zusammengesetzter Typ wird deklariert – Person.
Seine Daten werden in der String-Variable (zusammengesetzter Typ) name und der int-Variable (primitiver Typ) age gespeichert.
public class Rectangle
{
   int x, y, width, height;
}
Ein neuer zusammengesetzter Typ wird deklariert – Rectangle.
Er besteht aus vier int-Variablen (primitiver Typ).
public class Cat
{
   Person owner;
   Rectangle territory;
   int age;
   String name;
}
Ein neuer zusammengesetzter Typ wird deklariert – Cat. Er hat die folgenden Variablen:
owner, zusammengesetzter Typ Person
territory, zusammengesetzter Typ Rectangle
age, primitiver Typ int
name, zusammengesetzter Typ String

„Im Moment ist mir alles klar, so seltsam es auch erscheinen mag.“

„Große (zusammengesetzte) Typen enthalten viele kleine (primitive) Typen. Deshalb nehmen Objekte dieser Typen viel Speicherplatz in Anspruch – mehr als Variablen der primitiven Typen. Manchmal sogar erheblich mehr. Die Durchführung von Zuweisungsoperationen mit solchen Variablen dauerte früher sehr lange und setzte das Kopieren großer Speicherbereiche voraus. Deshalb speichern Variablen von zusammengesetzten Typen nicht das Objekt selbst, sondern nur eine Referenz darauf, d.h. seine Vier-Byte-Adresse. Dies reicht aus, um die Daten in solchen Objekten anzusprechen. Die Java-Maschine beherrscht alle damit verbundenen Aufgaben.“

„Ich habe nichts davon verstanden.“

„Wir haben bereits gesagt, dass eine Variable wie eine Box ist. Wenn du die Zahl 13 speichern willst, kannst du 13 auf einen Zettel schreiben und in die Box legen.“

„Aber stell dir vor, du musst etwas Größeres in der Box (Variable) speichern. Zum Beispiel einen Hund, ein Auto oder deinen Nachbarn. Anstatt zu versuchen, dieses Objekt in eine viel zu kleine Box zu drücken, könntest du etwas einfacheres tun: verwende ein Foto des Hundes anstelle des eigentlichen Hundes, ein Nummernschild anstelle eines echten Autos oder die Telefonnummer deines Nachbarn anstelle deines Nachbarn.“

„Wir nehmen einen Zettel und schreiben die Telefonnummer des Nachbarn darauf. Dies ist wie eine Referenz auf ein Objekt. Wenn wir den Zettel mit der Telefonnummer des Nachbarn darauf kopieren und in mehrere Boxen legen, gibt es nun mehr Referenzen auf deinen Nachbarn. Aber genau wie vorher hast du immer noch nur einen Nachbarn. Das ist nachvollziehbar, oder?“

„Ein wichtiges Merkmal der Datenspeicherung auf diese Weise ist, dass du viele Referenzen auf ein einzelnes Objekt haben kannst.“

„Interessant! Ich habe es fast verstanden. Bitte sag mir noch, was passieren würde, wenn ich eine Variable eines zusammengesetzten Typs einer anderen Variablen desselben zusammengesetzten Typs zuweisen würde.“

„Dann würden die beiden Variablen die gleiche Adresse speichern. Das bedeutet, wenn du die Daten des Objekts änderst, auf das eine Variable verweist, änderst du die Daten, auf die die andere Variable verweist. Beide Variablen referenzieren das gleiche Objekt. Natürlich kann es viele andere Variablen geben, die auch Referenzen darauf speichern.“

„Was machen Variablen von zusammengesetzten (Referenz-/Klassen-)Typen, wenn sie keine Referenz auf ein Objekt enthalten? Ist das überhaupt möglich?“

„Ja, Amigo. Soweit war ich eigentlich noch nicht. Das ist möglich. Wenn eine Variable eines Referenztyps (zusammengesetzt) keine Referenz auf ein Objekt speichert, dann speichert sie eine so genannte „Nullreferenz“. Im Wesentlichen bedeutet dies, dass es auf ein Objekt verweist, dessen Adresse 0 ist. Die Java-Maschine erzeugt jedoch nie Objekte mit dieser Adresse, so dass sie immer weiß, dass sie kein Objekt referenziert, wenn eine Referenzvariable 0 enthält.“

Java-Code Beschreibung
String s;
String s = null;
Äquivalente Ausdrücke.
Person person;
person = new Person();
person = null;
Wir erstellen eine Person-Variable, deren Wert Null ist.
Wir weisen ihr die Adresse eines neu angelegten Objekts Person zu.
Wir weisen der Variablen Null zu.
Cat cat = new Cat();
cat.owner = new Person();
cat.owner.name = "God";
Wir erstellen ein Katze-Objekt und speichern seine Adresse in der Variablen katze; katze.halter ist gleich null.
Wir setzen katze.halter gleich der Adresse eines neu erstellten Person-Objekts.
katze.halter.name ist immer noch gleich Null.
Wir setzen katze.halter.name gleich "Gott"

„Habe ich dich richtig verstanden? Variablen werden in zwei Typen unterteilt: primitive Typen und Referenztypen. Primitive Typen speichern Werte direkt, während Referenztypen eine Referenz auf ein Objekt speichern. Primitive Typen sind int, char, boolean und viele weitere. Referenztypen beinhalten alles andere. Wir verwenden Klassen, um sie zu erstellen.“

„Du hast völlig Recht, mein Junge.“

„Du sagst also, du hast alles verstanden. Hier sind ein paar Aufgaben, mit denen du dein Wissen vertiefen kannst.“