Wenn dies Ihr erster Besuch hier ist,
lesen Sie bitte zuerst die Hilfe - Häufig gestellte Fragen
durch. Sie müssen sich vermutlich registrieren,
bevor Sie Beiträge verfassen können. Klicken Sie oben auf 'Registrieren', um den Registrierungsprozess zu
starten. Sie können auch jetzt schon Beiträge lesen. Suchen Sie sich einfach das Forum aus, das Sie am meisten
interessiert.
Warum? Ist einfach persönliche Neugierde, zumal ich darüber nirgends etwas lesen konnte.
Allerdings stimmt Dein Beispiel nicht so ganz. Es wird beim System.out.println() nicht die Referenzadresse, sondern der Hashcode ausgegeben. Und die Haschcodes sind oder können unterschiedlich sein:
String s1 = "Hallo";
String s2 = new String("Hallo");
Liefert als Ergebnis z.B. :
s1 = 69490486
s2 = 69490486
ungleich
Also werden beim Vergleich nicht die Hashcodes verglichen (die in dem Beispiel gleich sind), sondern die Referenzen ( die deshalb unterschiedlich und von den Hashcodes verschieden sein müssen)
Die hash codes sind in diesem Bespiel deshalb gleich, weil String equals() und hashCode() überschreibt. Die Methode System.identityHashCode() liefert den default hash code wie er durch die Methode Object.hashCode() definiert ist. Für unterschiedliche Referenzen ist der identity hash code unterschiedlich (praktisch immer, aber es kann nicht für alle JVM und Plattformen garantiert werden, man sollte sich also nicht darauf verlassen). Der identity hash code ist aber auf jeden Fall für gleiche Referenzen gleich, das ist garantiert.
Als Antwort auf die ursprüngliche Frage: Es gibt mit Java-Bordmitteln keine Möglichkeit garantiert die Speicheradresse einer Referenz auszugeben. Die physikalische Speicheradresse kann sich auch während der Lebensdauer eines Objektes ändern (weil die VM Objekte im Speicher verschieben kann), der identity hash code bleibt aber gleich.
System.out.println(referenz);
gibt auch nur dann "Klassenname@hashCode" aus, wenn toString() nicht überschrieben wurde. Das ist einfach das default Verhalten von Object.toString(
nein, es gibt keine Möglichkeit, die Referenz als solche auszugeben.
Egal welche Methode man ausführt, ob hashCode() oder sonst eine, sie bezieht sich immer auf das Objekt, welches die Referenz referenziert.
Die Referenz selber - in Form einer physikalischen Speicheradresse? - kann man nicht ausgeben.
Die Verwaltung des Speichers ist in Java abstrahiert, sie wird von der VM übernommen. Als Enwickler muß man (fast) nichts darüber wissen. Als Entwickler hat sozusagen nur Zugriff auf die logische Abbildung.
Comment