2011-12-02 24 views
2

問這樣一個原始問題的道歉。如何在java中實現int in/out參數

我寫了一個函數帶了一個參數;這個參數應該是一個輸入/輸出參數。

調試後,我意識到,由於在java中沒有明確的引用類型,我應該使用Integer對象(而不是int primitive)作爲參數類型。所以我改變了我的功能:

boolean getNextFoo(int currentFoo) { 
    currentFoo = currentFoo + 1; 
} 

到:

boolean getNextFoo(Integer currentFoo) { 
    currentFoo = currentFoo + 1; 
} 

檢查調試器中執行後,我意識到這有相同的結果以前。也就是說,我通過的對象getNextFoo()不會更改。

問題1:如何使用Java實現in/out參數(更具體地用於基本類型)。我想(原諒我)對象總是通過引用傳遞。

問題2:我在互聯網上查找答案並閱讀Integer是不可變的。我理解不變的手段是不變的。如果是這樣,爲什麼編譯器(解釋器?)在getNextFoo函數中做currentFoo = currentFoo + 1時抱怨?

PS:我看到在Integer對象實際上沒有被傳遞到getNextFoo調試器,而不是Integer.valueOf值被傳遞到getNextFoo這是留給我更糊塗了。

回答

1

答1:

一種方法是在一個AtomicInteger傳遞,這是可變

boolean getNextFoo(AtomicInteger foo) { 
    foo.set(foo.get() + 1); 
    return true; 
} 

答2:

的語句:currentFoo = currentFoo + 1不修改所述對象;它正在創建新Integer實例重新分配本地參考以指向它。

當您退出該方法時,本地參考將「丟失」(即超出範圍),因此重新分配該方法的無效以外的方法。

+0

我猜想它正在用'(currentFoo + 1)'的值創建一個新的Integer實例。但是'整數'也是一個對象。如果我不能'myObject = myOldObject'來創建'myOldObject'的副本,編譯器如何創建一個也是對象的Integer副本?如果我的意圖是創建一個副本,我必須在myOldObject類中定義一個拷貝構造函數,以便能夠複製它。即使這樣,我也必須顯式調用myObject = new MyObject(myOldObject)來獲取副本。 –

0

整數是不可變的,這就是爲什麼它的值不能改變。

當我這樣做,爲什麼不編譯器(翻譯嗎?)抱怨currentFoo = currentFoo + 1

因爲當u做currentFoo = currentFoo + 1一個新的整數上堆和其參考創建被分配給currentFoo。

對於Integer,如果您想要在函數外獲得更改的值,您可以從函數返回值,您可以將該整數放入array/ArrayList並將該Array ArrayList傳遞給該函數。現在得到改變的價值,它會反映在功能之外。

0

問題1:如何使用Java實現輸入/輸出參數(更多 專用於原始類型)。我想(原諒我)反對 總是通過引用傳遞。

傳遞具有int類型的成員變量的可變類對象和更新通該對象的成員變量。

問題2:我正在網上查找答案並閱讀 Integer是不可變的。我理解不變的手段是不變的。如果是這樣, 爲什麼不編譯器(翻譯嗎?)抱怨,當我做currentFoo = currentFoo + 1 getNextFoo函數內?

新對象將被創建並將被分配到currentFoo

0

問題2:在一個新的對象與結果工作時調用currentFoo = currentFoo + 1被創建,其引用存儲在currentFoo。編譯器不會抱怨,因爲它不是無效的Java - 它只是導致創建一個新對象,而不是當前正在更新的對象。

2

Q1:在Java中參數總是按值傳遞。在對象的情況下,你通過引用,而不是參考本身的(這是經常混淆的原因)。要實現輸入/輸出參數,必須傳遞一個對象,該對象持有對實參數的引用。

Q2:不可變意味着對象不能修改,但變量可以。所以currentFoo = currentFoo + 1意味着:創建具有價值currentFoo + 1一個新的整數,然後分配這個新對象currentFoo。

+0

我猜想它正在用'(currentFoo + 1)'的值創建一個新的Integer實例。但是'整數'也是一個對象。如果我不能'myObject = myOldObject'來創建'myOldObject'的副本,編譯器如何創建一個也是對象的Integer副本?如果我的意圖是創建一個副本,我必須在myOldObject類中定義一個拷貝構造函數,以便能夠複製它。即使這樣,我也必須顯式調用myObject = new MyObject(myOldObject)來獲取副本。 –

+0

'currentFoo = currentFoo + 1'其實基本上等同於'currentFoo = new Integer(currentFoo + 1)' – Viruzzo

0

問題1:

你可以通過1個int數組,並改變獨特元素值,或通過一個可變的整數包裝對象(如AtomicInteger,例如)。或者,而不是使用in/out參數,您的方法可能會返回包含布爾字段和整數字段的對象。

問題2:

currentFoo = currentFoo + 1 

是相同的:

int tmp = currentFoo.intValue(); // auto-unboxing 
tmp = tmp + 1; 
currentFoo = Integer.valueOf(tmp); // auto-boxing 

一個新的整數實例因而分配給currentFoo。原始實例(不可變)不會被修改。

所有參數由Java的值傳遞。當使用對象時,對對象的引用被傳遞,並且按值傳遞:引用的副本被創建並傳遞給方法。如果將某些內容分配給傳入的引用,則將其分配給副本,並且原始引用仍然指向原始對象。