2012-02-23 84 views
2

我正在嘗試構建android GSM的litle gam。我有很多單位,他們都有目的地。爲了計算目的地,我使用了一個名爲CalDes的函數。此功能CalDes正在計算我的單位速度。所以我發送了一些變量,我必須再次編輯並使用它們。爲此,我必須將這些變量與參考一起發送。這裏是一個簡單的C++如何在java中做到這一點?在java中通過引用傳遞?

void swap(SomeType& arg1, Sometype& arg2) { 
    SomeType temp = arg1; 
    arg1 = arg2; 
    arg2 = temp; 
} 
... 
SomeType var1 = ...; // value "A" 
SomeType var2 = ...; // value "B" 
swap(var1, var2); // swaps their values! 
+0

你是什麼意思,沒有辦法在Java中引用?在Java中,除了本地類型(int,long,byte,boolean,double和float)之外,每個參數都通過引用傳遞。 – Fred 2012-02-23 11:17:27

+2

哦,男孩。不是另一個java「按值傳遞/按引用傳遞」。除了java是傳值! – Umair 2012-02-23 11:20:34

+0

關於此主題有大量現有問題,請在發佈之前進行搜索。 – DNA 2012-02-23 11:30:35

回答

12

Java根本沒有傳遞引用。你有兩個選擇:

  1. 傳遞一個數組中的數據:

    void swap(SomeType[] args) { 
        SomeType temp = args[0]; 
        args[0] = args[1]; 
        args[1] = temp; 
    } 
    

    ...但使用它是在調用代碼疼痛:

    SomeType a = ...; 
    SomeType b = ...; 
    SomeType[] args = new SomeType[] { a, b }; 
    swap(args); 
    a = args[0]; 
    b = args[1]; 
    
  2. 創建一個具有公共SomeType成員的對象,並傳入對象引用。

    void swap(SomeTypeContainer c) { 
        SomeType temp = c.a; 
        c.a = c.b; 
        c.b = temp; 
    } 
    

    這與#1非常相似,但從調用代碼使用可能更方便。

    SomeTypeContainer c = new SomeTypeContainer(/* ... something that creates a and b ... */); 
    // Use c.a and c.b directly 
    swap(c); 
    // Use c.a and c.b directly, they're now swapped 
    
+1

謝謝你的很好的解釋。 – 2012-02-23 11:56:38

1

在Java中,每個對象總是通過引用傳遞。但是你不能通過引用傳遞變量。如果你真的需要這個,你必須使用更多的間接方法。

+1

不完全 - 見http://stackoverflow.com/questions/40480/is-java-pass-by-reference – DNA 2012-02-23 11:22:02

+1

@DNA:嗯,這是 - 很多事情---是一個透視問題。如果我們談論引用,那麼Java就是通過價值傳遞的。如果我們談論物體,它是通過參考。 Java的傳球方式與大多數其他先發語言不同。您無法決定如何傳遞值或對象。在Java中傳遞一個對象是不可能的。而且你不能在Java中通過引用傳遞一個原始類型。這就是爲什麼有像java.lang.Integer這樣的類型。人。而且你不能將參考傳遞給參考。這是OP要求的。 – jmg 2012-02-23 11:31:09

+1

@jmg:這裏的關鍵是「傳遞參考」是一個特定的術語:它意味着將參考*傳遞給調用上下文中的**變量**到被調用的上下文中,所以被調用的上下文可以修改調用上下文的變量的內容。與對象引用絕對沒有任何關係。 Java完全是按價值傳遞的。 **值被傳遞,對於對象來說,是一個對象引用,但與通過引用沒有任何關係。 – 2012-02-23 11:34:11