7.4 Primitive Variable vs. Referenzvariable
Bei der Deklaration einer Variablen wird für sie im Arbeitsspeicher ein Speicherbereich reserviert.
7.4.1 Primitive Variable
Bei einer Variable mit einem primitiven Datentyp wird ein ihr zugewiesener primitiver Wert direkt in dem für sie reservierten Speicherbereich gespeichert.
Beispiel
In der folgenden Methode werden 100 EUR bei einem Zinssatz von 10% angelegt und die Kapitalhöhe nach einem bzw. zwei Jahren auf der Konsole ausgegeben.
Uns interessiert dabei, welche Auswirkungen die einzelnen Anweisungen auf die für die beiden Variablen anfangskapital und kapital reservierten Speicherbereiche haben.
Quellcode-Ausschnitt
2
3
4
5
6
7
8
9
10
11
12
13
14
double kapital;
double anfangskapital = 100.0;
kapital = anfangskapital;
kapital = kapital * 1.1;
System.out.println("Endkapital 1. Jahr:" + kapital);
kapital = kapital * 1.1;
System.out.println("Endkapital 2. Jahr:" + kapital);
}
Erläuterungen
Zeile 3 | Im Arbeitsspeicher wird ein Speicherbereich reserviert, der groß genug ist, damit dort einen Wert vom Typ double gespeichert werden kann. |
Zeile 4 | Im Arbeitsspeicher wird ein Speicherbereich reserviert, der groß genug ist, damit dort einen Wert vom Typ double gespeichert werden kann. Anschließend wird in dem reservierten Speicherbereich der Wert 100.0 gespeichert. |
Zeile 6 | An dem für die Variable kapital reservierten Speicherbereich wird eine Kopie des Werts abgelegt, der an dem für die Variable anfangskapital reservierten Speicherbereich zu finden ist. |
Zeile 8 | Der Wert, der an dem für die Variable kapital reservierten Speicherbereich abgelegt ist, wird um 10% erhöht. Der so berechnete Wert überschreibt dann den bisher an dieser Stelle gespeicherten. |
Zeile 9 | Auf der Konsole wird der Wert, der an dem für die Variable kapital reservierten Speicherbereich abgelegt ist, ausgegeben. |
Zeile 11 | Der Wert, der an dem für die Variable kapital reservierten Speicherbereich abgelegt ist, wird um 10% erhöht. Der so berechnete Wert überschreibt dann den bisher an dieser Stelle gespeicherten. |
Zeile 12 | Auf der Konsole wird der Wert, der an dem für die Variable kapital reservierten Speicherbereich abgelegt ist, ausgegeben. |
Gespeicherte Werte
Lokale Variable
Variable | Inhalt reservierter Speicherbereich |
---|---|
kapital | |
anfangskapital |
Konsole
7.4.2 Referenzvariable
Objekte werden in einem besonderen Bereich des Arbeitsspeichers, dem so genannten Heap, gespeichert. Je nach Klasse belegt das Objekt dort mehr oder weniger Speicherplatz. Nach der Erzeugung eines Objekts wird die Adresse (Referenz) der ersten Speicherstelle, die von dem Objekt belegt ist, zurückgegeben. Diese kann dann einer Variablen zugewiesen werden.
Bei der Deklaration einer Referenzvariable wird auf diese Weise nur so viel Speicherplatz reserviert, wie notwendig ist, um dort künftig eine Adresse speichern zu können. Für das Objekt selbst wird erst dann Speicherplatz im Heap reserviert, wenn das Objekt tatsächlich erzeugt wird.
Beispiel
Die folgende Methode erzeugt ein neues Objekt der Klasse Flug und übergibt dabei dem Konstruktor die entsprechende Flugnummer „AX125“. Im weiteren Verlauf wird dem Objekt als Flugziel „Rom“ zugewiesen.
Uns interessiert insbesondere, welche Auswirkungen die einzelnen Anweisungen auf die für die beiden Variablen flug1 und flug2 reservierten Speicherbereiche beziehungsweise das Objekt haben.
Quellcode-Ausschnitt
2
3
4
5
6
7
8
9
10
11
12
13
Flug flug1;
Flug flug2 = new Flug("AX125");
flug2.setZiel("Rom");
flug1 = flug2;
flug1.setZiel("Paris");
System.out.println("Ziel Flug1:" + flug1.getZiel());
System.out.println("Ziel Flug2:" + flug2.getZiel());
}
Erläuterungen
Zeile 3 |
Im Arbeitsspeicher wird ein Speicherbereich reserviert, der groß genug ist, damit dort eine Referenz (Adresse) gespeichert werden kann. |
Zeile 4 |
Im Arbeitsspeicher wird ein Speicherbereich reserviert, der groß genug ist, damit dort eine Referenz (Adresse) gespeichert werden kann. Es wird ein neues Objekt der Klasse Flug erzeugt. Dabei wird der String "AX125" übergeben, der dann vom Konstruktor dem Attribut flugNr zugewiesen wird. Das Objekt wird in einem Speicherbereich, der Heap genannt wird, gespeichert. Das Ergebnis des new-Operators ist eine Referenz, im Beispiel #4102, auf das Objekt. Diese Referenz wird in dem für die Variable flug2 reservierten Speicherbereich gespeichert. |
Zeile 6 | Dem Attribut ziel des Objekts, auf das die Variable flug2 verweist, wird "Rom" zugewiesen. |
Zeile 7 | An dem für die Variable flug1 reservierten Speicherbereich wird eine Kopie des Werts abgelegt, der an dem für die Variable flug2 reservierten Speicherbereich zu finden ist. |
Zeile 8 | Dem Attribut ziel des Objekts, auf das die Variable flug1 verweist, wird "Paris" zugewiesen. |
Zeile 10 | Auf der Konsole wird der Wert des Attributs ziel des Objekts, auf das die Variable flug1 verweist, ausgegeben. |
Zeile 11 | Auf der Konsole wird der Wert des Attributs ziel des Objekts, auf das die Variable flug2 verweist, ausgegeben. |
Gespeicherte Werte
Lokale Variable
Variable | Inhalt reservierter Speicherbereich |
---|---|
flug1 | |
flug2 |
Arbeitsspeicher (Heap)
Adresse | Speicherinhalt |
---|---|
#4102 |
:Flug
flugNr = "AX125"
ziel = null |
#4103 | |
#4104 | |
#4105 | |
#4106 |
Konsole
Ziel Flug2: Paris
Fragen 7-2: Referenzvariable
Vollziehen Sie den Quellcode-Ausschnitt nach und beantworten Sie dann die nachfolgenden Fragen.
Quellcode-Ausschnitt
2
3
4
5
6
7
8
9
kind = new Baby("Lisa");
System.out.println("Vorname: " + kind.getVorname());
kind = new Baby("Max");
System.out.println("Vorname: " + kind.getVorname());
kind.setGroesse(52);
-
In welcher Zeile wird eine Variable deklariert?
Lösung
Antwort:Zeile 1 -
Handelt es sich um eine primitive Variable oder eine Referenzvariable?
Lösung
Antwort:Um eine Referenzvariable, da ihr Typ eine Klasse ist. -
In welcher Zeile wird die Variable initialisiert?
Lösung
Antwort:In Zeile 3 wird der Variablen kind zum ersten Mal ein Wert zugewiesen. -
Sorgt die Anweisung in Zeile 6 dafür, dass Lisa nun den Vornamen Max bekommt?
Lösung
Antwort:In Zeile 6 wird ein neues Objekt der Klasse Baby erzeugt, das den Vornamen Max erhält. Der Variablen kind wird dann eine Referenz auf dieses Objekt zugewiesen. Das Objekt, das den Vornamen Lisa hat, bleibt davon völlig unberührt, erhält also auch keinen neuen Vornamen. -
Erläutern Sie, welchem Baby in Zeile 9 eine Größe von 52cm zugewiesen wird!
Lösung
Antwort:Wird Zeile 9 ausgeführt, verweist die Variable kind auf das Objekt, das Max repräsentiert. Dementsprechend wird Max die Größe 52cm zugewiesen. -
Ist es möglich Lisas Größe zu erfassen, nachdem die Anweisung in Zeile 6 ausgeführt worden ist?
Lösung
Antwort:Nachdem Zeile 6 ausgeführt worden ist, gibt es keine Variable mehr, die auf das Objekt, das Lisa repräsentiert, verweist. Daher kann dieses Objekt nicht mehr angesprochen werden.