Java для каждого цикла возвращает ссылку или эталонную копию? - PullRequest
6 голосов
/ 02 мая 2011

Я знаю, что Java на самом деле не использует точную передачу по ссылке, а скорее передачу по ссылке.Вот почему функция подкачки, которая только что пыталась обменяться ссылками, не будет работать в Java.Делает ли цикл for-each это также?Например, учитывая следующий код ...

for (Constraint c : getLeafNodes(constraintGraph)){
    c = new Constraint();
}

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

Я написал аналогичный метод для другого фрагмента кода, который прошел модульные тесты, которыезаставляет меня думать, что цикл for-each использует ссылки, а не эталонную копию, но наше программное обеспечение качества кода пометило это как мертвое хранилище для локальной переменной, серьезная ошибка.

Спасибо.

Ответы [ 3 ]

10 голосов
/ 02 мая 2011

Этого тоже не будет. Это похоже на высказывание

Object c = getObject();
c = new Object();

Все, что вы сделали, изменили то, к чему относится c. Это не будет работать, даже если Java поддерживает истинную передачу по ссылке

4 голосов
/ 02 мая 2011

Краткий ответ: ссылка-копия

Когда вы назначаете переменную итератора, она не будет передана в коллекцию. См. Итератор как доступ только для чтения к списку.

Java-цикл for работает точно так же, как цикл C # for-each, в котором while Enumerator может moveNext назначит локальной переменной элемент Current

0 голосов
/ 02 мая 2011

Нет, это не будет делать то, что вы ожидаете.c - это локальная переменная, которая ссылается / указывает на элемент в коллекции, возвращаемый getLeafNodes.В Java нет упомянутой вами концепции reference , все это reference .Если вы знаете, например, C или C ++, думайте о переменных объекта в java как указатели , а не ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...