2015-11-13 57 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++移植的代碼。 –

相關問題