Lassen Sie uns Schritt für Schritt durch es:
SomeObject so1 = new SomeObject("some property value");
... ist eigentlich viel komplizierter als es aussieht, weil Sie einen neuen String sind zu schaffen. Es könnte einfacher sein, als zu denken:
String tmp = new String("some property value");
SomeObject so1 = new SomeObject(tmp);
// Not that you would normally write it in this way.
(Um absolut genau zu sein - das ist nicht wirklich gleichwertig Im Original der ‚neue String‘ wird bei der Kompilierung erstellt und einen Teil des .class- Bildes ist.. Sie können als Performance-Hack daran denken.)
Also, zuerst die JVM Platz für den String zuweist. In der Regel wissen oder interessieren Sie sich nicht für die Interna der String-Implementierung. Nehmen Sie also einfach an, dass ein Teil des Speichers verwendet wird, um "einen Eigenschaftswert" darzustellen. Außerdem haben Sie vorübergehend Speicher reserviert, der einen Verweis auf den String enthält. In der zweiten Form heißt es explizit tmp
; In Ihrer ursprünglichen Form behandelt Java es, ohne es zu benennen.
Als nächstes weist die JVM Speicherplatz für ein neues SomeObject zu. Das ist ein wenig Platz für die interne Buchhaltung von Java und Platz für jedes der Felder des Objekts. In diesem Fall gibt es nur ein Feld, strSomeProperty
.
Beachten Sie, dass strSomeProperty
in einen String nur eine Referenz. Für jetzt wird es auf Null initialisiert.
Als nächstes wird der Konstruktor ausgeführt.
this.strSomeProperty = strSomeProperty;
All dies tut, ist die Referenz zum String kopieren, in Ihre strSomeProperty
Feld.
Schließlich Raum für die Objektreferenz so1
zugeordnet. Dies wird mit einem Verweis auf SomeObject festgelegt.
so2
Werke in genau der gleichen Weise.
Nein, es ist nicht komplizierter als es aussieht. "a" und neuer String ("a") sind keine äquivalenten Ausdrücke. String-Literale werden vom Compiler interniert. Sie verursachen keine zusätzlichen Heapzuweisungen, wenn sie verwendet werden. – bendin
http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.0 – bendin
Touche :) Allerdings denke ich Internieren ist konzeptionell noch komplizierter als das, was ich beschrieben habe. Ich denke, die passende Antwort hängt von der Absicht der Frage ab. – slim