Давайте пройдем через это:
SomeObject so1 = new SomeObject("some property value");
... на самом деле сложнее, чем кажется, потому что вы создаете новую строку. Это может быть проще думать как:
String tmp = new String("some property value");
SomeObject so1 = new SomeObject(tmp);
// Not that you would normally write it in this way.
(Чтобы быть абсолютно точным - это не совсем эквивалентно. В оригинале «новая строка» создается во время компиляции и является частью образа .class. Вы можете думать об этом как о хаке производительности.)
Итак, сначала JVM выделяет место для строки. Обычно вы не знаете или не заботитесь о внутренних элементах реализации String, поэтому просто верьте, что кусок памяти используется для представления «некоторого значения свойства». Кроме того, у вас временно выделена память, содержащая ссылку на строку. Во второй форме он явно называется tmp
; в исходном виде Java обрабатывает его, не называя его.
Затем JVM выделяет пространство для нового SomeObject. Это немного места для внутренней бухгалтерии Java и места для каждого из полей объекта. В этом случае есть только одно поле, strSomeProperty
.
Помните, что strSomeProperty
это просто ссылка на строку. Пока что он будет инициализирован нулем.
Далее конструктор выполняется.
this.strSomeProperty = strSomeProperty;
Все, что для этого нужно - скопировать ссылку в строку в ваше поле strSomeProperty
.
Наконец, место выделено для ссылки на объект so1
. Это устанавливается со ссылкой на SomeObject.
so2
работает точно так же.