Ist Java Objekt Zuordnung Referenz oder Value?
Wenn ich in Java Nodes habe also Knoten und ich habe folgendes (knoten haben ein Attribut Next)
n = null //der knoten is null keine Ahnung was das bedeutet aber sowas wie er ist mit null initialisiert also irgendwie existiert er aber auch nicht
k.next= n // next von k zeigt auf n also null
n = k // müsste Next von k jetzt nicht auf k selber zeigen wieso nicht ?
1 Antwort
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).
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.)
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
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.
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
Strg + K -> C
https://www.lernmoment.de/csharp-tutorial-deutsch/wichtige-tastaturkuerzel-visual-studio/