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.

Ein primitiver Wert ist ein einzelnes Datenelement, das für sich genommen eine bestimmte Bedeutung hat und nicht weiter zerlegt werden kann, ohne dass diese Bedeutung verloren geht. So können zum Beispiel eine Zahl oder ein Zeichen (Buchstabe, Ziffer, Sonderzeichen) primitive Werte sein. Eine Variable, die einen primitiven Wert aufnehmen kann, wird primitive Variable genannt. Bei der Deklaration einer primitiven Variable wird als Typ der Datentyp der primitiven Werte angegeben, die die Variable aufnehmen kann.

Merke: Primitiver Wert
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

JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void testePrimitiveVariable() {

    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 ge­spei­chert.
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.

Ein Referenzwert ist ein Verweis auf ein Objekt. Eine Variable, die einen Referenzwert aufnehmen kann, wird Referenzvariable genannt. Bei der Deklaration einer Referenzvariable wird als Typ die Klasse der Objekte angegeben, auf die die Variable verweisen kann.

Merke: Primitiver Wert
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

JAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
public void testeReferenzvariable() {

    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 ge­spei­chert.

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 Speicher­inhalt
#4102
:Flug
flugNr = "AX125"
ziel = null
#4103
#4104
#4105
#4106

Konsole

Ziel Flug1: Paris
Ziel Flug2: Paris

Der für eine primitive Variable reservierte Speicherbereich enthält direkt den primitiven Wert, der der Variable zugeordnet werden soll.

Der für eine Referenzvariable reservierte Speicherbereich enthält dagegen eine Referenz. Diese Referenz verweist auf den Speicherbereich im Heap, an dem das Objekt gespeichert ist, auf das die Variable verweisen soll.

Merke: Primitive Variable vs. Referenzvariable
Frage

Fragen 7-2: Referenzvariable

Vollziehen Sie den Quellcode-Ausschnitt nach und beantworten Sie dann die nachfolgenden Fragen.


Quellcode-Ausschnitt

JAVA
1
2
3
4
5
6
7
8
9
Baby kind;

kind = new Baby("Lisa");
System.out.println("Vorname: " + kind.getVorname());

kind = new Baby("Max");
System.out.println("Vorname: " + kind.getVorname());

kind.setGroesse(52);
  1. In welcher Zeile wird eine Variable deklariert? Lösung
    Antwort:
    Zeile 1
  2. Handelt es sich um eine primitive Variable oder eine Referenzvariable? Lösung
    Antwort:
    Um eine Referenzvariable, da ihr Typ eine Klasse ist.
  3. In welcher Zeile wird die Variable initialisiert? Lösung
    Antwort:
    In Zeile 3 wird der Variablen kind zum ersten Mal ein Wert zugewiesen.
  4. 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.
  5. 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.
  6. 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.