Почему код Java не работает при перемещении в функцию?

У меня есть фиктивная функция Java здесь. Если p является допустимым объектом, t должен указывать на него.

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 не равно нулю, а t равно нулю.

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

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

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

Что заставляет t указывать на нуль после того, как ему успешно присвоен ненулевой объект?

1 ответ

Решение

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

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

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

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