Referenztypen

Hey!
Ich bin Javaanfänger und habe ein Verständnisproblem bzgl. Referenztypen, also Objekten, Arrays...
Das Prinzip ist mir einigermaßen klar, nämlich dass ich nie direkt auf ein Objekt zugreife sondern immer nur auf seine Verknüpfung... Aber was genau hat das für einen Sinn? Wenn ich die einzige Referenz lösche, lösche ich auch das Objekt? Kann ich das Objekt überhaupt ändern? Wäre sehr dankbar für eine Aufklärung. Gruß Tobi
 

nrg

Top Contributor
Wenn ich die einzige Referenz lösche, lösche ich auch das Objekt?
du selbst kannst kein Objekt löschen du kannst höchstens die Referenzvariable, die auf das Objekt verweißt, auf ein neues Objekt referenzieren lassen bzw null zuweißen. Dadurch wird es zum Ausschuss und ein Fall für den gc.

Kann ich das Objekt überhaupt ändern?
kommt auf die Klasse an, von der das Objekt ist. Strings z.b. sind unveränderbar. Im Grunde veränderst du ja nicht das Objekt ansich sondern die Attribute, die das Objekt besitzt. Idr erledigen das die Setter (bei Kapselung).

obwohl schon ein wenig veraltet, empfehle ich ganz gern dieses kapitel und folgende zu dem thema: Kapitel 26 — Objektreferenzen sehr schön erklärt.
 
C

C_A

Gast
Bei elementare Datentypen: es werden x Byte im Speicher reserviert. Was du da reintust, ist absolut egal: int zahl = 2 ist vom Speicher her nichts anderes als int Zahl = 1024000. Der Wert selbst wird in die Variable geschrieben.

Bei komplexen Datentypen werden Referenzen angelegt. Auf dem Heap wird ein Objekt angelegt, das so aussieht "Hallo Welt". Du legst eiene Referenzvariable auf dieses Objekt an: String hallo. Schließlich verbindest du dieses Objekt mit der Variablen:
String hallo = "Hallo Welt";

So, zwei Sachen:
1. Den Heap kannst du Dir vorstellen wie ein Aquarium wo die Fisch lustig rumschwimmen. Die Fische sind Deine Objekte - sie haben Attribute und Vrhalten.
2. Was Referenzen sind: statt Fischen nimmst du jetzt Marionetten. Auf dre Bühne steht eine Puppe. Und oberhalb der Bühne steht dre Puppenspieler. Er hat eine Holzkreuz in der Hand - dieses Holzkreuz ist die Variable. Zwischen Holzkreuz und Marionette ist ein Faden - und dieser Faden ist die Referenz.

Wenn Du jetzt eine Referenz löschst:
String text = "hallo Welt";
text = null;
ist das so, wie wenn Du den Faden durchschneidest. Das Objekt - die Marionette - liegt halt einfach nutzlos rum, und niemand kann sie mehr ansprechen. Oder - wenn Du zum Beispiel die Fische im Aquarium als Objekte nimmst: irgendwann stirbt ein Fisch, was in java-Sprache bedeutet, dass ein objekt auf dem heap ist, auf das keine Referenz mehr besteht. Wenn ein Objekt keine Refernz mehr hat, wird es vom Garbage Collector irgendwann entfernt. Ein Objekt ohne Referenz ist wie ein Fisch, dre nicht an der Leine liegt - oder eine Marionette, die ohne Verbindung zum Holzkreuz auf dre Bühne liegt.

Das Beispiel mit dre Marionette: Du kannst mit dem Holzkreuz die puppe dazu bringen, dass sie ien Bein hebt. Genauso steuerst du mit dre Variablen über die Referenz das Objekt:
String hallo = "Hallo Welt";
hallo.toUpperCase();

hat Auswirkung auf das objekt.

Das Literal "Hallo welt" ist - je nacdem, welchen Vergleich Du bevorzugst - ein Fisch im Aquarium oder eine Marionette auf der Bühne.

War das einigermaßen verständlich?
 
Zuletzt bearbeitet von einem Moderator:

nrg

Top Contributor
String hallo = "Hallo Welt";
hallo.toUpperCase();

hat Auswirkung auf das objekt.

nicht wirklich. Strings sind wie oben schon gesagt unveränderbar. hallo.toUpperCase() erzeugt nichts weiter als ein neues String Objekt, was dann, um auf deine Erklärung zu referenzieren, "eine Puppe ohne Holzkreuz" wäre.
Ein String ist da vllt ein nicht so gutes Beispiel. Um hallo auf ein Objekt referenzieren zu lassen, dass "HALLO WELT" als Attributwert besitzt müsste man schreiben:
String hallo = "Hallo Welt";
hallo = hallo.toUpperCase();

Dadurch wird das Objekt mit dem Inhalt "Hallo Welt" aber nicht geändert sondern die Variable hallo auf das mit hallo.toUpperCase() erzeugte Objekt referenziert. D.h. das erste Objekt (Attributwert "Hallo Welt") würde irgendwann vom gc beseitigt werden.

Wenn ich dabei falsch liegen sollte, lasse ich mich natürlich gerne eines Besseren belehren ;). So habe ich es zumindest noch in Erinnerung.

ansonsten aber sehr schön erklärt.
 

El Rakiti

Mitglied
Wenn ich dabei falsch liegen sollte, lasse ich mich natürlich gerne eines Besseren belehren ;). So habe ich es zumindest noch in Erinnerung.

ansonsten aber sehr schön erklärt.

So kenn ich es auch, zumindest von .Net her. Das ist auch der Grund, warum man -wenn man mit dem String arbeitet- mit StringBuilder arbeiten sollte. Möchte man z.B. in einer Variablen einen HTML Code zusammenbauen, dann das ganze mit dem StringBuilder machen, da sonst unsinnig viele Objekte erstellt werden.

Stimmts oder lieg ich falsch ;-)?
 

nrg

Top Contributor
Stimmt schon, stilistisch zumindest. im Grunde ist es imho aber das Gleiche, weil in dem Fall die VM automatisch einen StringBuilder nimmt.
 

El Rakiti

Mitglied
Ach wirklich? In .Net wurde mir der Grund genannt, auf StringBuilder auszuweichen...(Warum klingen solche Sätze immer so arg sarkastisch^^?)

Woher weiß die VM denn, wann sie String und wann StringBuilder nehmen soll? Denn es bestehen doch bestimmt auch Unterschiede zwischen den Klassen...
 
C

C_A

Gast
Wenn ich dabei falsch liegen sollte, lasse ich mich natürlich gerne eines Besseren belehren ;). So habe ich es zumindest noch in Erinnerung.

ansonsten aber sehr schön erklärt.

Vielen Dank!

Deine Beschreibung ist richtig!

Ich habe mein Post gestern zwischen zwei anderen Projekten schnell runtergetippt. Mit dem String isses schwer zu erklären, weil immutabel. Ich habe mich auch eher uneindeutig ausgedrückt. Auswirkung auf ein objekt insoweit, als die Referenz auf dieses Objekt verändert wird, und die Variable auf ein neues Objekt referenziert. Das alte Objekt ist GC-Futter. Das meinte ich mit "Auswirkung haben" ;-)
 

Ähnliche Java Themen

Neue Themen


Oben