我这里有一个虚拟的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的原因是什么?
答案 0 :(得分:3)
Java始终为pass by value,在函数内重新分配对象引用不会影响函数外部。
Java是按值传递的,问题是--with对象 - 传递的值是引用...按值。这意味着如果您将一个对象(在Java中,将对象地址/引用传入)传递给一个函数,那么您可以更改对象的属性(通过它的引用),但是您不能设置变量引用(仅存在)在函数内部)因为你正在改变变量所指向的对象。您传入的原始引用保持不变,因为该函数已丢失对它的引用。
如果您返回对象,那么您将按值返回引用/地址并将其设置为函数外部的变量,因此它可以正常工作。