Почему замена root.left и root.right с использованием временной переменной работает, но, казалось бы, эквивалентный подхJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему замена root.left и root.right с использованием временной переменной работает, но, казалось бы, эквивалентный подх

Сообщение Anonymous »

Я пытаюсь понять семантику ссылок Java при замене полей в узле двоичного дерева.

Код: Выделить всё

This version works correctly:
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
Но эта версия не работает:

Код: Выделить всё

TreeNode tmp = root;
root.right = tmp.left;
root.left = tmp.right;
Моя путаница заключается в следующем:

• В обоих случаях tmp присваивается значение типа TreeNode

• root.left и root являются ссылками на TreeNode

• Когда tmp назначается root.left, последующие изменения в root.left не влияют на tmp

• Но когда tmp назначен root, последующие изменения в корне влияют на то, что tmp наблюдает
С моей точки зрения, оба присваивания копируют ссылку на TreeNode, поэтому я не понимаю, почему изменение root.left не влияет на tmp, а изменение root влияет.
Какова семантическая разница между этими двумя случаями в Java?

В частности, чем назначение из поля (root.left) отличается от назначения самой ссылки на объект (root)?
Я я не спрашиваю, как инвертировать дерево — я спрашиваю, почему поведение ссылки в этих двух случаях различается.

Подробнее здесь: https://stackoverflow.com/questions/798 ... e-work-but
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»