2010-12-06 39 views
0

有沒有什麼辦法可以通過值將可變對象傳遞給java中的函數?如何通過值將可變對象傳遞給java

我真正想要的是將一個對象傳遞給一個方法,對它進行一些操作(改變它),並再次只使用該舊對象(而不是更改後的值)調用該方法。

這裏是一些示例:

{ MyObj obj = new MyObj(); obj.setName("name"); 

    append(obj); 
    System.out.println(obj.name); 

    prepend(obj); 
    System.out.println(obj.name); 

    } 

    void append(MyObj obj){ obj.name+="1"; } 

    void prepend(MyObj obj){ String a = "1"; obj.name=a+obj.name; } 

這段代碼的最後,我想輸出:

name1 
1name 
+0

如果對象*發生了變異,您只會得到該輸出,不是嗎?你如何期待知道你想要在第一次調用`println` *之後忽略附加的「1」*? – 2010-12-06 12:12:04

+0

這就是我想知道的。我怎樣才能做到這一點? – Anand 2010-12-06 16:14:59

回答

4

對象本身並不在Java中通過的。永遠。

但是所有東西是通過值傳遞 - 其中唯一可以傳遞的是原始值和引用。

你不是很清楚你想要做什麼 - 是你想有一個方法(比如說)StringBuilder參數的想法,但沒有任何方法中的對象的變化可見給呼叫者?如果是這樣,你基本上需要自己克隆對象。

+0

絕對正確,但我沒有自己指出,因爲我認爲OP不會發現它有用。 :)這其實有點不像我。 ;) – 2010-12-06 11:26:34

+1

@Karl:理解對象模型(並且如果你有一個引用類型的變量,那個變量的值是一個引用,而不是一個對象),對於在Java,IMO中避開它絕對是核心。我對這個話題非常挑剔:) – 2010-12-06 11:28:43

+0

Jon Skeet還沒有投票?奇怪的! :)(2分鐘後...)沒關係......他得到了一個! :) – 2010-12-06 11:39:38

1

爲什麼你需要這樣做?如果你不改變對象,那麼它並不重要。如果您更改了對象,並且不想影響調用者的對象,那麼只需在本地複製。但我猜想至少有90%的人認爲他們需要這樣做,但他們確實不這樣做。

顯示一些代碼。你是什​​麼真的試圖做?

2

不幸的是,沒有。 Java 從不按值傳遞對象,它按值傳遞對象的引用

here說明:

真正的情況是, 對象始終在Java引用 舉行 - 從來沒有價值 - 和 引用,確實,被按值傳遞 。

-2

AFAIK不可變/可變與傳遞值/引用無關。字符串通過引用傳遞,而不是值。使字符串不可變的原因是字符串類本身的設計。 也許你可能會解釋更多你想要的東西。