[Java vs. C++] Unterschied zw. Objekt und Referenz auf Objekt
-
Ich habe hier einen Text, in dem steht:
In Java wird nicht zwischen dem Typ eines Objekts obj und dem Typ der Referenz auf obj unterschieden.
Im Gegensatz dazu werden in C++ Objekte und Objektreferenzen typmaessig unterschieden.Kann mir jemand das mal genauer erklaeren, auch mit den daraus resultierenden Konsequenzen?
Als C++-Programmierer habe ich im Moment keine Wirkliche Vorstellung, was der Satz eigentlich nun genau bedeutet.Danke im Voraus!
-
Object a=new Object(); a.setValue(4); Object b=a; b.setValue(5); a.getValue() == 5
Object a; a.setValue(4); Object b=a; b.setValue(5); a.getValue() == 4 Object& c=a; c.setValue(6); a.getValue() == 6
-
Die oben zitierte Aussage ist schlichtweg falsch. Es werden Objekte und Referenzen unterschieden. Die Semantik ist entsprechend grundverschieden.
Der einzige Unterschied ist, dass in Java nicht explizit dereferenziert wird, weil es anhand der Sprache immer eindeutig ist, was jetzt geschehen soll.getText().putIntoBucket();
-
@AllesWisser: Bitte unterlasse solche sinnlosen Postings. Ich habe eine konkrete Frage gestellt.
Jahe, verwende einfach nicht Java. Das ist voll langsam. C++ ist geil!
Danach habe ich nicht gefragt
@Shade of Mine:
Und was hat das jetzt fuer Konsequenzen?
Was fuer ein Sinn stekckt dahinter?@Optimizer:Das soll falsch sein??
Der Text stammt aus dem aktuellen Java Kurs der Fernuniversitaet Hagen. Bist du dir wirklich ganz sicher??
-
In Java wird nicht zwischen dem Typ eines Objekts obj und dem Typ der Referenz auf obj unterschieden.
Das ist mit Sicherheit nicht richtig. Es findet keine syntaktische Unterscheidung statt, das ist richtig, aber die Semantik (z.B. bei einer Zuweisung) ist unterschiedlich. d.h. Referenzen und Objekte (wie ein int z.B., Objekte können ja auch primitiv sein) verhalten sich unterschiedlich bei '=' und '=='.
Kann man jetzt spitzfindig finden, ist aber ein IMHO signifikanter Unterschied, den man kennen muss und ich finde, dass der Satz auf eine falsche Fährte führt. Man sollte das konkretisieren.
-
Und weil du die Konsequenzen wissen wolltest:
Bei Referenzen wird beim Einsatz von '==' die Identität verglichen, bei primitiven Typen der Wert. Gleiches gilt für die Zuweisung, Referenzen zu kopieren heißt nicht, das Objekt zu kopieren. Es findet, wie beim Kopieren von C++-Pointern eine Überlagerung von Namen statt, über die beide das selbe Objekt manipuliert werden kann.
-
Optimizer: Deine Theorie wird wesentlich vereinfacht, wenn du primitive Typen nicht als Objekte bezeichnest.
Ich sehe primitive Typen und Referenzen in einer Schublade, und Objekte in der anderen Schublade. Primitive Typen und Referenzen kann ich by-value übergeben, auf dem Stack ablegen, zuweisen, bei == wird der Wert verglichen. An Objekte komm ich direkt gar nicht ran, weil es keinen Ausdruck gibt, der als Ergebnis ein Objekt hat. Ich kann sie nur -- indirekt, wenn man so will -- über Referenzen ansprechen.