Ist Java Objekt Zuordnung Referenz oder Value?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Wenn es die Sprache nicht verbietet, ist es theoretisch möglich, dass ein Objekt sich selbst referenziert.

Objekte werden meistens als Referenz weitergereicht oder angesprochen. Das liegt daran, dass beim Value-Zugriff eine Kopie des Objekts herstellen müsste, was automatisch schwer zu leisten ist. Ein einfaches Array müsste zum Beispiel Element für Element umkopiert werden (oder eine vorbereitete Methode müsste dies tun).

EasternPremise 
Fragesteller
 05.06.2023, 10:23
hmm, kannst du hier den unterschied erklären:

Node n1 = new Node(6);

Node n2 = new Node (8);

Node n3 = new Node (10);

n1.next = n2;

System.out.println(n1.next.data); // 8

n2 = n3;

System.out.println()n1.next.data; //immernoch 8

aber: 
    wenn ich vorher n2.data auf irgndweine zahl setze wird das erkannt, also wieso wird bei n2 = n3 bei n1.next immernoch das alte n2 genommen

0
Suboptimierer  05.06.2023, 10:26
@EasternPremise

n1.next = n2

Von hier an zeigt der Nachfolger von n1 auf den Speicher von n2.

n2 = n3

Von hier an zeigt der Nachfolger von n1 immer noch auf den Speicher vom alten n2
n2 zeigt allerdings auf denselben Speicher wie n3.

(Ohne die n1.next = n2 Zuweisung bekommst du übrigens durch n2 = n3 ein Speicherleck [sofern das Java nicht intern regelt], denn es gäbe keine Referenz mehr auf den Speicherbereich vom alten n2.)

1
EasternPremise 
Fragesteller
 05.06.2023, 10:34
@Suboptimierer

achso ok, ich habe also 3 speicheradressen und aber wenn ich beispielsweise n1.data = 110 mache dann ändere ich konkret den wert der in dieser speicheradresse liegt oder

0
Suboptimierer  05.06.2023, 10:46
@EasternPremise

n1 ist eine Objektreferenz. data ist ein Speicherbereich, der intern auf n1 referenziert. Mit der Instanzziierung von n1 wurde der Speicher für data reserviert und die Referenz erstellt. Da data ein Basisdatentyp zu sein scheint, steht als value dort keine Adresse, sondern ein Wert vom Basisdatentyp.

An einer Speicherstelle kann entweder ein Wert stehen oder eine Adresse. In dem Fall ein Wert. Der Datentyp bestimmt, wie viel Speicher reserviert wird, das heißt wie viele Bytes gelesen werden und wie der Inhalt interpretiert werden soll.

In einigen Programmiersprachen war zum Beispiel eine Zeichenkette immer ein Array. Das heißt, es wurde auf eine Adresse gezeigt. Das Ende wurde durch ein spezielles Zeichen gekennzeichnet. Man konnte aber theoretisch auch darüber hinaus lesen bis zum Ende des reservierten Speichers und man konnte sogar darüber hinaus schreiben, was aber andere Inhalte anderer Variablen kaputt machen konnte.
Das war ein schwer auffindbarer Fehler. Nicht umsonst verbieten das moderne Programmiersprachen.

1
EasternPremise 
Fragesteller
 05.06.2023, 10:57
@Suboptimierer

vielen dank, noch eine kleine organisatorische sache: bei visual studio code, wie kann ich da mehrere zeilen auskommentieren indem ich die zeilen markiere und dann eine tastenkombi drücke? ich finde die tastenkombi nicht

0