我遇到了一些我无法理解的事情,从未意识到可以做到。
我正在玩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术语,使用'按引用调用 '而是,'按价值传递'或'按值调用'?
是的,我之前已经读过这个question,但是我感到难过,或者这是Android的事情?
任何人都可以对此有所了解吗?
答案 0 :(得分:4)
在对象的情况下,地址是一个值,该值被复制,类似于原始值。但它是一个指向对象的值,并且不会复制该对象。它只在内存中存在一次,可以被操作。
答案 1 :(得分:3)
outRect
引用传递给getHitRect
方法,然后修改outRect
引用的对象。引用按值传递。
有关详细说明,请阅读以下文章:http://javadude.com/articles/passbyvalue.htm
答案 2 :(得分:1)
对Rect对象的引用是按值传递的,但Rect对象本身是在堆上分配的,因此可以更新它。实际上,这为您提供了传递引用语义。但是,您无法更改参考;换句话说,这样的事情是行不通的:
public void someFunction(Rect r) {
r = new Rect(); // will not be seen by the calling function
}
答案 3 :(得分:1)
您所关联的问题得分最高的答案非常清楚地解释了这一点:
Java始终是按值传递的。困难的是可以理解Java将对象作为通过值传递的引用传递。
然后继续展示两个例子,这些例子对你所询问的行为毫不神秘,除非我误解了你的惊讶。
答案 4 :(得分:1)
Java中方法的所有参数都是通过值传递的,包括基元和对象。但是,Java中引用对象的方式更接近于C ++指针而不是值。例如,考虑Java中的任何对象值都可以取值null
,但在C ++中,只有指针才能取值null
(而对象和引用*始终是有效的初始值)。
但是,对象值的值传递实际意味着什么?它意味着创建一个对象的副本并将其推送到堆栈以供被调用的方法使用。而对于指针,它意味着将指针值推送到堆栈上。这样,调用方法和被调用方法都可以访问存储对象值的相同内存位置。因此,在被调用方法中执行的任何更改都将反映在调用方法中。
*在某些情况下,引用可能包含损坏的数据。