Рекурсивный переход в объект по ссылке? ДЖАВА

Поэтому у меня есть алгоритм, который заставляет меня передавать объект в качестве параметра рекурсивно, и на разных глубинах рекурсии он устанавливает значения объекта. Проблема в том, что Java не позволяет мне делать это, потому что они передаются по значению или что-то еще, что просто портит меня. Как вы можете убедиться, что переданный объект сохраняет установленное значение?

2 ответа

Вы никогда не передаете объект в качестве аргумента в Java. Вы либо передаете ссылку или примитивное значение. Аргумент всегда передается по значению. У Java вообще нет передачи по ссылке.

Если вы передаете ссылку на объект и хотите убедиться, что вызываемый код не изменяет данные в этом объекте, вы можете выбрать следующие параметры:

  • Создайте копию и передайте ссылку на нее
  • Сделайте ваш тип неизменным в первую очередь.

РЕДАКТИРОВАТЬ: Просто чтобы прояснить, если у вас есть:

Foo f = new Foo();

тогда значение f это не Foo объект. Это ссылка на Foo объект. Если вы сейчас позвоните:

doSomething(f);

тогда значение f копируется как исходное значение параметра в doSomething, Такое поведение является в основном определением передачи по значению. Там нет ничего doSomething может сделать изменить значение f - он все равно будет ссылаться на тот же объект впоследствии. Данные в этом объекте могли измениться, но это не будет другой объект.

В реальной аналогии: если я дам вам копию моего адреса, вы можете пойти и покрасить входную дверь, но вы не можете изменить место, где я живу.

Как утверждает Джон, все не примитивы передаются путем передачи копии ссылки. У тебя нет выбора. Таким образом, ваш рекурсивный метод должен иметь возможность обновлять объект, если он изменчив. ОДНАКО, вы не можете переназначить ссылку и ожидать, что она распространится обратно в стек вызовов. И помните, что строки не являются изменяемыми.

Другими словами, если вы делаете следующее, вы не изменили переданный объект:

void myMethod(Object o){
     o = new Object();
}

Вышеизложенное меняет местную ссылку на o но не меняет ссылку звонящего на o, Если вам нужно сделать что-то подобное, вам нужно будет вернуться o,

Другие вопросы по тегам