Этот вопрос связан скорее с правильной конструкцией Java-программы. Мне было интересно: что происходит с
public Clazz {
this.someClazz = new SomeClazz();
} //initialization
Clazz x = y;
Является ли приведенный выше конструктор выполненным, или он пропущен, а someClazz memberget - новое значение сразу?
Вам нужно различать переменные, объекты и ссылки.
Значения x
и y
не являются объектами - это просто ссылки. Оператор присваивания просто копирует значение из выражения справа на переменную слева. Таким образом, в вашем случае он копирует значение y
в x
... в этой точке значения обеих переменных относятся к одному и тому же объекту. Никакие конструкторы или другие члены не вызываются - это просто копирование значения. Так, например:
// Assuming appropriate methods...
x.setFoo("new foo");
System.out.println(y.getFoo()); // Would print "new foo"
Однако две переменные по-прежнему независимы:
x.setFoo("new foo");
x = new Clazz();
x.setFoo("yet another foo");
System.out.println(y.getFoo()); // Would print "new foo"
Здесь, после второй строки, значения x
и y
относятся к разным объектам, поэтому вызов x.setFoo()
не изменяет значение foo
внутри объекта, к которому относится y
.
Здесь в фрагменте кода Clazz x = y;
, вы не создаете никаких новых объектов. Вы просто говорите, что теперь ссылка x
будет ссылаться на тот объект, на который указывает y
.
Когда вы создали объект y
, Clazz y = new Clazz();
, тогда y
начинается со ссылкой на объект, находящийся в куче.
y--------------------------> Obj1
и после Clazz x = y;
x-----> y---------> Obj1
это на самом деле что-то вроде следующего
x--->Obj1<----y
Здесь, поскольку новый объект не был создан, поэтому конструктор не будет вызван, и не будет инициализации члена, т. this.someClazz = new SomeClazz();
не будет выполнено.
В вашем коде вы не создаете новый подход своего класса, вы просто назначаете ссылку y
на свою переменную x