2015-11-13 130 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非空且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]和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后,它已被成功地分配一个非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++移植的代码。 –

相关问题