0

我遇到了一些我无法理解并且从未意识到可以做到的事情。

我在 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 的说法,使用“按引用调用”,而是使用“按值传递”或“按值调用” ?

是的,我之前读过这个问题,但我很困惑,或者那是 Android 的问题?

任何人都可以对此有所了解吗?

4

5 回答 5

4

在对象的情况下,地址是一个值,该值被复制,类似于原始值。但它是一个指向对象的值,并且该对象不会被复制。它在内存中只存在一次并且可以被操作。在此处输入图像描述

于 2012-07-07T00:06:22.870 回答
3

outRect引用被传递给该getHitRect方法,然后该方法修改由 引用的对象outRect。引用是按值传递的。

有关这方面的详细说明,请阅读这篇文章:http: //javadude.com/articles/passbyvalue.htm

于 2012-07-07T00:08:15.607 回答
1

对 Rect 对象的引用是按值传递的,但 Rect 对象本身是在堆上分配的,因此可以对其进行更新。实际上,这为您提供了按引用传递的语义。但是,您不能更改参考;换句话说,这样的事情是行不通的:

public void someFunction(Rect r) {
  r = new Rect(); // will not be seen by the calling function
}
于 2012-07-07T00:10:50.160 回答
1

您链接到的问题的评分最高的答案非常清楚地解释了这一点:

Java 始终是按值传递的。很难理解 Java 将对象作为按值传递的引用来传递。

然后它继续展示两个例子,这些例子在你所询问的行为中没有留下任何谜团,除非我误解了让你感到惊讶的事情。

于 2012-07-07T00:14:32.583 回答
1

Java 中方法的所有参数都是按值传递的,包括原语和对象。但是,Java 中引用对象的方式更接近于 C++ 指针而不是值。例如,考虑 Java 中的任何对象值都可以取值null,但在 C++ 中只有指针取值null(而对象和引用*始终是有效的初始化值)。

但是对象值的按值传递实际上意味着什么?这意味着创建一个对象的副本并将其压入堆栈以供调用的方法使用。而对于指针,它意味着将指针值压入堆栈。这样,调用和被调用的方法都可以访问存储对象值的相同内存位置。因此,在被调用方法中执行的任何更改都将反映在调用方法中。

* 在某些情况下,引用可能包含损坏的数据。

于 2012-07-07T00:21:44.820 回答