我知道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
类型的对象。关于如何实现这样的事情的任何想法?
答案 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
引用的对象的状态,因为该引用是一个可以传递的值。