为什么 Java 代码在移入函数时不起作用?

Why Java code doesn't work when moved into a function?

我这里有一个虚拟 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 不为 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);
    }

结果应该是p和t(board[row][col]和threater)都指向同一个对象。然而,我的程序以代码 41 退出,表明 t 在函数调用后被取消。 Piece class 有一些枚举变量,没什么特别的。如果我将函数调用替换为以下内容,一切都很好。

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

是什么让 t 在成功分配了一个非 null 对象后指向 null?

Java 始终是 pass by value,在函数内部重新分配对象引用不会影响函数外部。

Java 是按值传递,问题是 - 对于对象 - 传递的值是引用...按值。这意味着如果你将一个对象(在 Java 中,对象 address/reference 被传入)传递给一个函数,那么你可以更改对象的属性(通过它的引用)但你不能设置变量引用(仅存在于函数内部)到另一个对象,因为您正在更改变量指向的内容。您传入的原始引用保持不变,因为函数已丢失对它的引用。

如果您 return 对象,那么您 return 按值 reference/address 并将其设置为函数外部的变量,因此它有效。