Java: Что происходит с предполагаемыми инициализированными членами при передаче значения их объекту во время создания?

1

Этот вопрос связан скорее с правильной конструкцией Java-программы. Мне было интересно: что происходит с

public Clazz { 
   this.someClazz = new SomeClazz(); 
}  //initialization

Clazz x = y; 

Является ли приведенный выше конструктор выполненным, или он пропущен, а someClazz memberget - новое значение сразу?

  • 1
    Дело не в том, чтобы «иметь правильную конструкцию Java-программы», а в том, чтобы понять фундаментальные аспекты языка.
Теги:
initialization
constructor

3 ответа

1
Лучший ответ

Вам нужно различать переменные, объекты и ссылки.

Значения 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.

  • 0
    ВАУ! Это мой мистер Джон Скит сам отвечает на мой скромный вопрос: D Я всегда видел ваши подробные ответы на другие вопросы и восхищался вашими знаниями в программировании:) В любом случае, возвращаясь к вопросу, спасибо за ваш ответ, теперь мне стало намного понятнее , Кстати, их слишком много, вы рекомендуете хорошую книгу по Java?
1

Здесь в фрагменте кода 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(); не будет выполнено.

  • 0
    Спасибо за подробные ответы:) Если бы я сначала прочитал ваш ответ, я бы выбрал его.
0

В вашем коде вы не создаете новый подход своего класса, вы просто назначаете ссылку y на свою переменную x

Ещё вопросы

Сообщество Overcoder
Наверх
Меню