在Java中遇到引用传递。我怎么能做同样的事情?

时间:2017-08-26 07:57:33

标签: java android pass-by-reference

我知道Java只是通过值传递而不是通过引用传递。但是我在为Android编程时遇到了这个问题:

int originalPos[] = new int[2];
view.getLocationOnScreen(originalPos);
int m = originalPos[0];

转到方法声明,我发现:

public void getLocationOnScreen(int[] outLocation) {
    throw new RuntimeException("Stub!");
}

我没有声明这种方法。我可以做这样的事情,以便能够通过引用(这实际上不是通过引用传递,并且只适用于一个变量)来实现Java中的伪传递:

int locationOnscreen;

public void getLocationOnScreen() {
    locationOnscreen = 10;
}

但是getLocationOnScreen(int[])是在Android SDK中声明的。

view是Android SDK中View类型的对象。关于如何实现这样的事情的任何想法?

1 个答案:

答案 0 :(得分:0)

猜测问题:是的,Android SDK使用的事实是,虽然Java没有传递引用(方法无法伸出并更改变量传递给它),变量中的值,或传递给函数等,对象(包括数组)不是对象本身;它是一个值,表示对象在别处的位置,在内存中。因此,该对象的 state 可以通过接收对它的引用的函数进行修改。对于您提到的Android SDK方法,可能是它填充了数组。

这是方法可以返回多条信息的方式之一。 (另一个 - 可以说是同一个,真的 - )是接受一个非数组对象,它的属性填充。

让我们举一个更简单的例子:

public class Temp {
    public static void main(String args[] ) throws Exception {
        int[] x = new int[1];
        System.out.println(x[0]); // 0, the default value for int[] entries
        changeIt(x);
        System.out.println(x[0]); // 42, it changed
    }

    private static void changeIt(int[] a) {
        a[0] = 42;
    }
}

main运行时,我们创建一个数组并在x中存储它的对象引用。在记忆中,我们有类似的东西:

                             +−−−−−−−−−+
x=Ref554615−−−−−−−−−−−−−−−−−>| (array) |
                             +−−−−−−−−−+
                             | 0: 0    |
                             +−−−−−−−−−+

“Ref554615”完全是概念性的,我们从未看到对象引用的实际值(不,甚至不是来自对象的默认toString,尽管有相反的谣言)。

现在,main调用changeIt,将x中的传递给函数。当我们输入changeIt时,我们有类似的内容:

                             +−−−−−−−−−+
x=Ref554615−−−−−−−−−+−−−−−−−>| (array) |
                   /         +−−−−−−−−−+
                   |         | 0: 0    |
                   |         +−−−−−−−−−+
                   |
a=Ref554615−−−−−−−−+

然后changeIt执行a[0] = 42,我们有:

                             +−−−−−−−−−+
x=Ref554615−−−−−−−−−+−−−−−−−>| (array) |
                   /         +−−−−−−−−−+
                   |         | 0: 42   |
                   |         +−−−−−−−−−+
                   |
a=Ref554615−−−−−−−−+

然后changeIt返回,然后返回main我们:

                             +−−−−−−−−−+
x=Ref554615−−−−−−−−−−−−−−−−−>| (array) |
                             +−−−−−−−−−+
                             | 0: 42   |
                             +−−−−−−−−−+

changeIt无法更改变量 x ;但它可以更改x引用的对象的状态,因为该引用是一个可以传递的值。