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.“

1
Aufgabe
Java Syntax,  Level 2Lektion 2
Gesperrt
Berechne den Umfang eines Kreises
Nun, wir haben einen Plan. Setzen wir ihn um. Implementiere zunächst eine Methode, die den Umfang eines Kreises berechnet. Dazu musst du die richtige Formel in die Methode schreiben und die Parameter angeben. Aber was ist mit Pi? Wir wissen, dass es 3,141592... und so weiter bis zur Unendlichkeit ist. Wir halten die Sache lieber einfach und sagen pi = 3,14.
7
Aufgabe
Java Syntax,  Level 2Lektion 2
Gesperrt
Unser erster Umwandler!
Du hast wahrscheinlich schon oft elektronische Umwandler oder Programme verwendet, um eine Menge in einer Einheit in eine Menge einer anderen Einheit umzurechnen. Zum Beispiel Dollar in Euro oder Meilen in Kilometer. Jetzt ist es an der Zeit, dass wir ein solches Tool programmieren. Konkret werden wir ein Programm schreiben, das eine Temperatur von Grad Celsius in Grad Fahrenheit umwandelt.
3
Aufgabe
Java Syntax,  Level 2Lektion 2
Gesperrt
Woher kommt eine Person?
In Java kommen die Leute aus demselben Ort, aus dem auch andere Klassen kommen: aus dem Kopf des Programmierers. Es ist wichtig, dass der Schöpfer einer Klasse darüber nachdenkt, was für die Klasse wichtig ist und was nicht. Wenn er oder sie das tut, dann wird die Klasse sinnvoll und nützlich sein. Los geht‘s! Lass uns eine Personenklasse erstellen, die es unserer Person erlaubt, einen Namen, ein Alter, ein Gewicht und... Geld zu haben. Und dann erstellen wir ein Objekt.
3
Aufgabe
Java Syntax,  Level 2Lektion 2
Gesperrt
Familienbeziehungen
Ein Programmierer kann einen Mann und eine Frau mit ein paar geschickten Fingerbewegungen erschaffen. Kinderleicht: Wir schreiben die entsprechenden Klassen und erstellen Objekte. Arbeiten wir an einem Ehepaar: Wir erstellen die Objekte Mann und Frau und speichern dann eine Referenz auf die Frau in mann.ehefrau und eine Referenz auf den Mann in frau.ehemann. Alles klar? Du brauchst nicht einmal eine Heiratsurkunde.
3
Aufgabe
Java Syntax,  Level 2Lektion 2
Gesperrt
Gehaltserhöhung
Gut, wenn man Programmierer ist: Dein Gehalt wird schnell steigen. Und wenn das nicht so sein sollte, kannst du die Situation mit ein wenig Hilfe deiner Hackerfreunde beeinflussen. Stell dir vor, du hättest Zugriff auf das automatische Lohnabrechnungssystem. Du musst eine Abfangmethode schreiben, die 1000 Euro zu jeder Gehaltszahlung hinzufügt.
1
Aufgabe
Java Syntax,  Level 2Lektion 2
Gesperrt
Teil eines Taschenrechners
Lassen wir den Computer für uns zählen! Schließlich wurden Computer genau dafür erfunden. In dieser Aufgabe bitten wir den Computer, die Summe und das Produkt zweier Zahlen zu berechnen. Alles ist super einfach: Wir deklarieren int-Variablen, weisen ihnen einen Wert zu, addieren und multiplizieren sie und zeigen dann das Ergebnis an.