2012-07-07 64 views
0

傳遞出參數我碰到的東西,我無法理解,並沒有意識到這是可以做到。怎麼就是Java能夠從方法

我與Android中的代碼塊打轉轉,什麼吸引了我是這樣的:

public boolean onTouch(View v, MotionEvent event){ 
    Rect outRect = new Rect(); 
    _btn.getHitRect(outRect); 
    // ... rest of code cut 
    // outRect fields of that Rect object is 'filled' in. 
} 

它是如何Android的Java可以直接修改Rect對象outRect這是在傳遞到方法爲了獲得按鈕小部件的Rect

這讓我吃驚,因爲我想有作爲Java的通過引用傳遞「,在Java中的說法沒有這樣的事情,使用「的call-by-參考」,而其」按值傳遞'或'撥打電話'?

是的,我已閱讀本question問過,但我難倒,或者是一個Android的事嗎?

任何人都可以對此有所瞭解嗎?

+0

我添加了一個圖像,也許它有幫助。 – Ixx 2012-07-07 00:20:16

+0

感謝球員們的答案 - 現在非常感謝,它是有道理的! :) +1給我所有的人:) – t0mm13b 2012-07-07 00:20:18

+0

看看我的答案在這裏:http://stackoverflow.com/questions/9404625/java-pass-by-reference/9404727#9404727 – 2012-07-07 00:21:18

回答

3

outRect參考被傳遞給getHitRect方法,其然後修改由outRect引用的對象。引用是按值傳遞的。

有關此的詳細說明,請閱讀本文:http://javadude.com/articles/passbyvalue.htm

+0

這有點令人困惑 - 你說「引用是按值傳遞的」,換句話說就是副本? (順便說一句 - 收藏 - 歡呼夥伴) – t0mm13b 2012-07-07 00:10:04

+0

參考(地址)本身是一個副本,因此它仍然是相同的地址。所以它指向同一個對象。 – Ixx 2012-07-07 00:11:54

+1

@ t0mm13b沒錯!名稱「'outRect'」實際上是對象的引用的名稱。該引用通過值(即複製)傳遞給'getHitRect'方法,該方法然後具有對'outRect'引用的同一對象的引用。重要的是要注意的是'outRect'引用的OBJECT沒有被傳遞,只是對它的引用。 – 2012-07-07 00:12:07

4

地址,在對象的情況下,是一個值,該值被複制,類似於原始值。但它是一個指向一個對象的值,並且該對象不會被複制。它在內存中只存在一次,可以被操縱。 enter image description here

+1

這是不正確的;對象是*不通過。引用被傳遞,機制是有價值的。它不僅僅是語義。 – duffymo 2012-07-07 00:13:41

+0

這就是我的意思,只是表達不正確,纔會糾正它。 – Ixx 2012-07-07 00:18:43

+0

希望自己能夠給予好評這個答案不止一次:)謝謝:) – t0mm13b 2012-07-07 00:20:56

1

到矩形對象的引用是按值傳遞但Rect物件本身在堆上分配,因此它可以被更新。實際上,這給你傳遞引用語義。但是,您不能更改參考;換句話說,這樣的事情是行不通的:

public void someFunction(Rect r) { 
    r = new Rect(); // will not be seen by the calling function 
} 
1

收視率最高的答案,您鏈接到的問題解釋了這個漂亮的清楚:

的Java總是傳遞的價值。難以理解的是,Java將對象作爲引用傳遞給對象。

然後,繼續展示兩個例子,在您詢問的行爲中沒有留下任何神祕的東西,除非我誤解了您的意外。

+0

從C產品/ C++背景 - 這就是讓我感到驚訝:從我d但是,是+1,即使我讀了鏈接的問題是哪一種讓我掙扎了一下。 :) – t0mm13b 2012-07-07 00:15:53

1

所有參數在Java方法是按值,無論是原語和對象通過。但是,在Java中引用對象的方式更接近於C++指針而不是值。例如,考慮在Java中任何對象的值可以採取值null,但在C++只有指針使取值null(而對象和引用*總是有效的初始化值)。

但到底是傳址值的對象值實際上意味着什麼呢?它意味着創建一個對象的副本並將其推送到堆棧中供被調用的方法使用。而對於指針來說,它意味着將指針值推送到堆棧上。這樣,調用方法和被調用方法都可以訪問存儲對象值的相同內存位置。因此,在調用方法中執行的任何更改都會反映在調用方法中。

*有些情況下引用可能包含損壞的數據。