Frage zum "Referenzen-konzept" in Java

Zrebna

Bekanntes Mitglied
Hi!

ich weiß, dass es in Java keine so "vor den Kullissen" Zeiger gibt, wie in C/C++, und dass die Referenzvariablen auch nicht wirklich
auf Speicheradressen von, im Speicher existierenden Objekten, zeigen, sondern auf deren Object-IDs -> effektiv ist das Endergebnis aber das selbe und es Objektvariablen zeigen quasi auf das objekt und können dessen Inhalte nutzen.

Dazu habe ich ein Bild gefunden, was ich hier hochlade und meiner Meinung nach ist es aber an den rot-markierten Stellen falsch?
Effektiv ist ja die Reeferenzvariable das, was in C ein Doppelpointer ist, d.h. ein Zeiger auf einen Zeiger bzw. eine Referenz auf eine Referenz - ist das korrekt?
Denn hier zeigt ja 'wagen2' auch direkt auf das Objekt, was eben nicht richtig ist?
Ist mein Korrekturvorschlag bzw. meine Überlegung bzgl. dem Bild richtig oder falsch?

Kann Jemand für Aufklärung sorgen? ^^

Lg
Zrebna
 

Anhänge

  • Referenzen_Java.PNG
    Referenzen_Java.PNG
    177,3 KB · Aufrufe: 54

httpdigest

Top Contributor
Effektiv ist ja die Reeferenzvariable das, was in C ein Doppelpointer ist, d.h. ein Zeiger auf einen Zeiger bzw. eine Referenz auf eine Referenz - ist das korrekt?
Nein. Es gibt hier (was die Java Language Specification angeht) keine Indirektionsstufen. Und tatsächlich gibt es diese Indirektion in keiner JVM Implementierung, die ich kenne. Dort sind sogenannte "Ordinary Object Pointer" (OOP) wirklich die virtuellen Speicheradressen der Objekte (plus ein paar Optimierungen, wie Adress-Ausrichtung an 8-Bytegrenzen, so dass man Adressen mit weniger Bits repräsentieren kann - Stichwort "Compressed OOPs"). Nur, kommt man (ausser mit der Hilfe von Arrays und sun.misc.Unsafe Magie) nicht an diese Adresse heran. Jedesmal eine Indirektion bei jeder Dereferenzierung von Objekten durchführen zu müssen, wäre auch viel zu teuer und wird deshalb auch nicht gemacht.
Das einzige, was man hier sieht, was wie eine Adresse "aussieht", ist der Identity-Hashcode des Objektes. Und dieser ist tatsächlich zumindest in HotSpot auch der Ordinary Object Pointer (auf 32-bit abgeschnitten), nur eben wird der Wert dieser Adresse zum Zwecke der "Konstantheit" des hashCode() im Objekt selbst nochmal gespeichert. Wenn das Objekt durch GC also relocated wird, dann verändert sich der HashCode nicht, wenn er vorher schon einmal durch hashCode() abgefragt wurde. Naja, das nur dazu.
Denn hier zeigt ja 'wagen2' auch direkt auf das Objekt, was eben nicht richtig ist?
Doch, ist richtig.
Ist mein Korrekturvorschlag bzw. meine Überlegung bzgl. dem Bild richtig oder falsch?
Ist falsch.
Kann Jemand für Aufklärung sorgen? ^^
Ja. :)
Also: Wie du schon richtig gesagt hast, gibt es in Java keine reinen "Zeiger", die man wie in C/C++ als Ganzzahlen interpretieren könnte und sogar Zeigerarithmetik auf ihnen betreiben kann. Das ist in Java nicht möglich. Objekte haben nur eine Identität und keine sichtbaren "Speicheradressen", mit denen man dann (wie gesagt) Zeigerarithmetik betreiben könnte.
Und, wenn du eine Variable `wagen2` auf eine andere Variable `wagen1` zuweist, dann zeigt nicht etwa `wagen2` auf die "Variable" `wagen1`, sondern `wagen2` zeigt auf dasselbe Objekt wie `wagen1` zum Zeitpunkt der Zuweisung. Das heisst also, der Wert der Variablen `wagen2` ist eine Referenz auf dasselbe Objekt wie bei `wagen1`. Implementierungstechnisch enthalten dann in HotSpot beide Variablen die virtuelle Speicheradresse von dem einen Objekt.
 

Zrebna

Bekanntes Mitglied
Das Bild ist richtig.
Was passiert denn, wenn man den Code ergänzt um die Zeile
Java:
wagen1 = new Kraftwagen("0-4");
welchen Inhalt hat danach wagen2?
Dann zeigt wagen1 nicht mehr auf das Kraftwagen("0-1")-Objekt, sondern auf das
neu erzeugte Kraftwagen("0-4")-Objekt?
Und hat dann foglich als Referenz-ID/Kennung nicht mehr 1008, sondern die Kennung die das neue Objekt hat?

@httpdigest:
Danke für deinen ausführlichen Post - ich lese ihn mir morgen in Ruhe durch, da ich für Heute weg muss, aber noch kurz eben dem Vorposter antworten wollte...

Lg,
Zrebna
 

fhoffmann

Top Contributor
Dann zeigt wagen1 nicht mehr auf das Kraftwagen("0-1")-Objekt
Meine Frage war aber, welchen Inhalt danach wagen2 (nicht wagen1) hat. Nach deinen rot gemalten Pfeilen würde sich dies ja auch ändern.
Probiere doch
Java:
class Kraftwagen {
    String text;
    public Kraftwagen(String text) {
        this.text = text;
    }
    public String toString() {
        return text;
    }
}

public class Test {
    public static void main(String[] args) {
        Kraftwagen wagen1 = new Kraftwagen("0-1");
        Kraftwagen wagen2 = wagen1;
        System.out.println(wagen1);
        System.out.println(wagen2);
        wagen1 = new Kraftwagen("0-4");
        System.out.println(wagen1);
        System.out.println(wagen2);
    }
}
 

Zrebna

Bekanntes Mitglied
Nein. Es gibt hier (was die Java Language Specification angeht) keine Indirektionsstufen. Und tatsächlich gibt es diese Indirektion in keiner JVM Implementierung, die ich kenne. Dort sind sogenannte "Ordinary Object Pointer" (OOP) wirklich die virtuellen Speicheradressen der Objekte (plus ein paar Optimierungen, wie Adress-Ausrichtung an 8-Bytegrenzen, so dass man Adressen mit weniger Bits repräsentieren kann - Stichwort "Compressed OOPs"). Nur, kommt man (ausser mit der Hilfe von Arrays und sun.misc.Unsafe Magie) nicht an diese Adresse heran. Jedesmal eine Indirektion bei jeder Dereferenzierung von Objekten durchführen zu müssen, wäre auch viel zu teuer und wird deshalb auch nicht gemacht.
Das einzige, was man hier sieht, was wie eine Adresse "aussieht", ist der Identity-Hashcode des Objektes. Und dieser ist tatsächlich zumindest in HotSpot auch der Ordinary Object Pointer (auf 32-bit abgeschnitten), nur eben wird der Wert dieser Adresse zum Zwecke der "Konstantheit" des hashCode() im Objekt selbst nochmal gespeichert. Wenn das Objekt durch GC also relocated wird, dann verändert sich der HashCode nicht, wenn er vorher schon einmal durch hashCode() abgefragt wurde. Naja, das nur dazu.

Doch, ist richtig.

Ist falsch.

Ja. :)
Also: Wie du schon richtig gesagt hast, gibt es in Java keine reinen "Zeiger", die man wie in C/C++ als Ganzzahlen interpretieren könnte und sogar Zeigerarithmetik auf ihnen betreiben kann. Das ist in Java nicht möglich. Objekte haben nur eine Identität und keine sichtbaren "Speicheradressen", mit denen man dann (wie gesagt) Zeigerarithmetik betreiben könnte.
Und, wenn du eine Variable `wagen2` auf eine andere Variable `wagen1` zuweist, dann zeigt nicht etwa `wagen2` auf die "Variable" `wagen1`, sondern `wagen2` zeigt auf dasselbe Objekt wie `wagen1` zum Zeitpunkt der Zuweisung. Das heisst also, der Wert der Variablen `wagen2` ist eine Referenz auf dasselbe Objekt wie bei `wagen1`. Implementierungstechnisch enthalten dann in HotSpot beide Variablen die virtuelle Speicheradresse von dem einen Objekt.
Ah, ok - denke ich verstehe es nun - vielen Dank!
Das heißt, dass quasi eine Referenzvariable, die auf eine andere Referenzvariable zugewiesen wird, zeigt einfach auf das selbe Objekt,
auf was die zugewiesene Referenzvariable gegenwärtig zeigt...
Ok, also dnan ist klar, dass es keine Art Doppelzeiger geben kann.
 

Zrebna

Bekanntes Mitglied
Meine Frage war aber, welchen Inhalt danach wagen2 (nicht wagen1) hat. Nach deinen rot gemalten Pfeilen würde sich dies ja auch ändern.
Probiere doch
Java:
class Kraftwagen {
    String text;
    public Kraftwagen(String text) {
        this.text = text;
    }
    public String toString() {
        return text;
    }
}

public class Test {
    public static void main(String[] args) {
        Kraftwagen wagen1 = new Kraftwagen("0-1");
        Kraftwagen wagen2 = wagen1;
        System.out.println(wagen1);
        System.out.println(wagen2);
        wagen1 = new Kraftwagen("0-4");
        System.out.println(wagen1);
        System.out.println(wagen2);
    }
}
Mit dem oben zitiertem Post von httpdigest, würde ich eben nun sagen, dass wagen2 als Wert immer noch 1008 hat, also immer noch auf das "0-1"-KFZ-objekt zeigt, auf was vorher wage1 gezeigt hat und wagen1 aber nun auf das neu erzeugte Objekt

Test mit deinem Quellcode hat es auch bestätigt - Danke hierfür!:)

Lg
Zrebna
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
T Frage zu Parse Java Basics - Anfänger-Themen 2
H Frage an die Profis Java Basics - Anfänger-Themen 4
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
F Kurze Frage zu replace() Java Basics - Anfänger-Themen 19
JavaSchmecktLecker Polymorphie Frage zur Methodenüberschreibung Java Basics - Anfänger-Themen 21
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
DoubleM Runtime.getRuntime().exec Frage Java Basics - Anfänger-Themen 2
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
O Frage: Formaler Typbezeichner? Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
L Frage zum Array Java Basics - Anfänger-Themen 1
A Frage zum UML Design Java Basics - Anfänger-Themen 1
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
A OCA Study Guide: 2. Frage aus Kapitel 3 Java Basics - Anfänger-Themen 9
sserio Date Library Frage Java Basics - Anfänger-Themen 9
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
sserio Frage zu HashMaps Java Basics - Anfänger-Themen 20
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
sserio Frage zu Lambda Ausdrücken Java Basics - Anfänger-Themen 7
sserio Frage zu BigInteger Java Basics - Anfänger-Themen 1
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
xxx12 Frage Java Basics - Anfänger-Themen 2
I Generelle Frage zu Mikroservices (Spring Boot?), Docker... Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
A Frage zur programmierung Java Basics - Anfänger-Themen 12
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
R Input/Output Frage zu Java IO Java Basics - Anfänger-Themen 6
M Frage zu printWriter Java Basics - Anfänger-Themen 5
C Frage zu OLSMultipleLinearRegression Java Basics - Anfänger-Themen 31
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Verständnis-Frage zu einer HÜ? Java Basics - Anfänger-Themen 1
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
L Frage zur Ticket Maschine Java Basics - Anfänger-Themen 1
J Frage zu OOP-Klassendiagramm Java Basics - Anfänger-Themen 8
OSchriever Frage zu Compiler Java Basics - Anfänger-Themen 8
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
F Frage betreff Programmierbücher zu Lagerverwaltung als Konsolenprogramm Java Basics - Anfänger-Themen 3
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
I String.split regex Frage Java Basics - Anfänger-Themen 2
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
dieter000 Frage zu einem Beispiel... Java Basics - Anfänger-Themen 5
J Frage zum Loggen Java Basics - Anfänger-Themen 18
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
marcooooo Frage zu bestimmten Beispiel Java Basics - Anfänger-Themen 31
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
B Erste Schritte Learning Coding (!) Frage an erfahrene Programmierer. Java Basics - Anfänger-Themen 23
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
C Exception-Frage Java Basics - Anfänger-Themen 3
J Eine Frage zur Schreibweise == ? : Java Basics - Anfänger-Themen 3
S Frage des Designs Java Basics - Anfänger-Themen 1
JavaTalksToMe Extends/Implements Frage Java Basics - Anfänger-Themen 3
pkm Frage zu Servletfunktion Java Basics - Anfänger-Themen 0
B Frage zur Währungsumrechnung Java Basics - Anfänger-Themen 3
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
D Frage zur IDE IntelliJ IDEA Java Basics - Anfänger-Themen 6
H Frage zum 2d Array Java Basics - Anfänger-Themen 1
N Frage zum Newton-Fraktal Java Basics - Anfänger-Themen 1
H Frage zu interfaces Java Basics - Anfänger-Themen 1
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
I Frage zu SkipList Java Basics - Anfänger-Themen 4
G Frage zu JScrollPane Java Basics - Anfänger-Themen 12
Kirby.exe Allgemeine Frage Java Basics - Anfänger-Themen 3
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
J Kleine Frage zu OOP Java Basics - Anfänger-Themen 371
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
F Frage zu Iteratoren Java Basics - Anfänger-Themen 2
C Erste Schritte Frage zur ArrayList Java Basics - Anfänger-Themen 15
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
H Frage zur ermittlung eines doppelte Paars aus Sotieralgorithmus Java Basics - Anfänger-Themen 4
H Frage zum Array Java Basics - Anfänger-Themen 17
G Schach -Frage 2- Maussteuerung Java Basics - Anfänger-Themen 7
G Schach in Java - Allgemeine Frage zur Architektur Java Basics - Anfänger-Themen 7
B Fachliche Frage bei Rechnungen Java Basics - Anfänger-Themen 16
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
B Frage zu Datenbank Design - Rechnungen, Angebote... und deren Positionen Java Basics - Anfänger-Themen 4
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 2
H Einfache Frage zur Punktnotation objektname.methode(wert) Java Basics - Anfänger-Themen 2
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 3
H Frage zur if-Bedingung bzw switch case Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben