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

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

Сообщение Anonymous »

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

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

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, последующие изменения в root действительно влияют на то, что наблюдает tmp.
С моей точки зрения, оба присваивания копируют ссылку на TreeNode, поэтому я не понимаю, почему изменение root.left не влияет на tmp, а изменение root влияет.
Какова именно семантическая разница между этими двумя случаями в Java?

В частности, как происходит присваивание из поля (

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

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

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

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

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

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

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

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