Ссылка на объект не обновляет объект

Привет, я работаю с кодом, который выглядит примерно так.

class A { Custom objA; public A() { //Assign some value to objA; B obj = new B(objA); } } class B { Custom objB; public B(Custom obj) { this.objB = obj; } public void Func() { this.objB = null; } } 

где Custom – это настраиваемый тип с нулевым значением.

Теперь, по моим сведениям, objA необходимо обновить, чтобы иметь значение null, всякий раз, когда я objA Func() class B Однако это не то, что происходит.

Я здесь что-то не так?

Во-первых, в строке 5 у вас есть синтаксическая ошибка. Вы можете сделать B obj = new B(objA) если вы пытаетесь создать новый экземпляр B Но я могу только догадываться.

Кажется, что вы пытаетесь сделать, это изменить objA , передав его в новый объект типа B , сохранив его в поле, а затем изменив поле. Проблема в том, что то, что вы храните, является копией ссылки на objA . Когда вы делаете this.objB = null , вы objB поле objB чтобы иметь новую ссылку ( null ), но вы ничего не сделали для поля objA которое является членом экземпляра classа A

Мне кажется, что это код, о котором вы спрашиваете в своем вопросе:

 class A { Custom objCustom; public A() { objCustom = new Custom(); B objB = new B(objCustom); objB.Func(); } } class B { Custom objCustom; public B(Custom objCustom) { this.objCustom = objCustom; } public void Func() { this.objCustom = null; } } 

Это компилирует и имеет довольно последовательное соглашение об именах.

Проблема с Custom objCustom полем Custom objCustom в classах A и B заключается в том, что хотя оба они ссылаются на один и тот же экземпляр перед вызовом .Func() вам нужно понять, что Custom objCustom поле Custom objCustom является просто ссылкой на объект , а не сам объект. Поэтому, когда вы вызываете .Func() вы назначаете новую ссылку на Custom objCustom в objB , но вы ничего не делаете с ссылкой в objA . Он по-прежнему указывает на исходный объект.

В функции Func вы присваиваете null полю B объекта (не A объект), поэтому после этого поля вызова функции objB объекта B не указывает на какой-либо объект типа Custom , но поле objA объекта A все еще указывает на один Custom объект.

Вот пример кода, где Func изменит поле objA объекта A :

 class A { public Custom objA = new Custom(); public A() { B obj = new B(this); B.Func(); // after this, objA field will be null } } class B { А obj; public B(А obj) { this.obj = obj; } public void Func() { obj.objA = null; } } 

Также обратите внимание:

  1. Когда вы создаете объект A , его поле objA равно null , поэтому в конструкторе A вы фактически вызываете B obj = new B(null); , поэтому его поле objB равно null .
  2. После того, как объект Object будет создан, объект obj типа B будет удален, так как вы не держите ссылку на него, поэтому вы не вызываете функцию Func в вашем примере.