2015-11-13 2 views
1

У меня есть фиктивная функция Java здесь. Если p - действительный объект, t должен указывать на него.Почему код Java не работает при перемещении в функцию?

private void turhake(Piece p, Piece t) { 
    if (null == t && null != p) { 
     t = p; 
     if (null == t) System.exit(44); 
    } else System.exit(43); 
} 

В следующем коде я гарантирую, что указанная выше функция вызывается только в том случае, если p не имеет значения null и t равно null.

if (threatener != null) System.exit(42); 
    if (board[row][col] != null) { 
     turhake(board[row][col], threatener); 
     if (threatener == null) System.exit(41); 
    } 

Результат должен быть, что и р и т (плата [строка] [столбец] и threatener) указывают на тот же объект. Однако моя программа выходит с кодом 41, что указывает на то, что после вызова функции t был аннулирован. Класс Piece имеет несколько переменных перечисления, ничего особенного. Если я заменил вызов функции следующим, все будет хорошо.

if (threatener != null) System.exit(42); 
    if (board[row][col] != null) { 
     threatener = board[row][col]; 
     if (threatener == null) System.exit(41); 
    } 

Что означает, что t указывает на null после того, как ему был назначен ненулевой объект?

+7

Java использует пропуск по значению, всегда. Изменение параметра ('t = p;' в вашем методе) не влияет. См. Http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value –

+2

Вам следует попробовать просто вернуть 'p' из метода и назначить его таким образом. Его пропуск по значению отсутствует. – 3kings

+0

угроза безопасности * никогда * не назначена. Java - это «вызов по значению». – JimmyB

ответ

3

Java всегда pass by value, переназначение ссылки на объект внутри функции не влияет на нее вне функции.

Java передается по значению, проблема в том, что - с объектами - переданное значение является ссылкой ... по значению. Это означает, что если вы передаете объект (в Java, адрес объекта/ссылка передается) в функцию, вы можете изменить свойства объекта (через ссылку), но вы не можете установить ссылку на переменную (которая существует только внутри функции) к другому объекту, потому что вы меняете то, что указывает переменная. Исходная ссылка, которую вы передали, остается той же, поскольку функция потеряла свою ссылку на нее.

Если вы возвращаете объект, вы возвращаете ссылку/адрес по значению и устанавливаете его переменной вне функции, поэтому она работает.

+0

Это очень помогает. Мне придется переосмыслить мой код, который я портировал с C++. –

Смежные вопросы