2013-11-27 89 views
0

我正在學習Java,並且不禁想知道Java如何傳遞函數參數和返回值。我做了一些搜索,發現Java只按值傳遞對象。但是,有些人對此提出質疑。他們聲稱在處理複雜數據類型(不是原始的,如int)時它只傳遞一個指針。Java函數傳遞和返回複雜數據類型

這是否意味着對本地對象所做的任何更改都會影響原始對象?有沒有什麼辦法可以通過值來傳遞「PURELY」(即製作一個Object的硬拷貝)?

此外,返回值是什麼?例如,我們使用訪問器(或getter函數 - 我不完全確定它們是如何被調用的)來保護ADT的私有屬性不被更改爲「非法」值。如果Java傳遞指針,那麼無論我對Accessor函數的返回對象所做的更改是否也會影響實際屬性,如果它不是原始數據類型,不是嗎?

有誰能幫我澄清這些概念嗎? 先謝謝您! :D

+0

請參閱http://stackoverflow.com/questions/40480/is-java-pass-by-reference?rq=1 - 基本上返回值是相同的。返回值是原始值或引用。從不是物體。 –

回答

2

關鍵是要了解Java通過所有值爲。對於對象也是如此:它通過值通過指針。因此,它不會創建對象的副本,而是創建參考的副本。

這同樣適用於返回。所以,是的,你的想法是正確的:你可以修改屬性(稱爲類成員)對象,因爲它們以指針的形式返回。這就是爲什麼(如果需要的話)某人可以選擇設計一個對象在創建後不可修改的類。

+0

感謝您的回答。想象一下你有一個String類型的屬性。那麼,實際上一個訪問器會返回一個指向那個String的指針?如果是,什麼阻止用戶將其更改爲任意值? (假設該字符串必須取某些允許的值中的一個) – someone

+0

Java中的字符串被設計爲不可變的,以防止這種情況。如果你想「修改」一個字符串,你將不得不復制它。 –

+0

好的,這可能是一個錯誤的例子......我爲我的錯誤感到抱歉,我還沒有在Java方面有經驗。如果我有一些其他類型的屬性,會發生什麼?它不會完全暴露給用戶嗎? – someone

0

我已經做了一些搜索,發現Java只傳遞 值的對象。

有你的困惑。您不能在Java中傳遞對象,因爲對象不是Java中的值。 Java中唯一的類型是基元類型和引用類型(引用是指向對象的指針)。所以你可以在Java中操作的唯​​一值是基元和指向對象的指針。所有類型都通過值或賦值。

+0

是的,我知道。它將指針傳遞到對象在內存中的位置。然而,在Java中沒有指針類型,這就是爲什麼我有一些麻煩表達自己... – someone

+0

@angel:唔,不是基本類型的每種類型都是指針類型。引用是指向對象的指針。引用類型是指針類型。 – newacct