移动到函数中时为什么Java代码不起作用?

时间:2015-11-13 19:55:34

标签: java android object null copying

我这里有一个虚拟的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]和threatner)指向同一个对象。但是我的程序以代码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的原因是什么?

1 个答案:

答案 0 :(得分:3)

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

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

如果您返回对象,那么您将按值返回引用/地址并将其设置为函数外部的变量,因此它可以正常工作。