2017-08-26 87 views
0

我知道Java只是通过值而不是通过引用。但我面对的Android此同时编程:在Java中遇到引用传递。我怎么能做同样的事情?

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

目前尚不清楚你的问题是什么。但是你的*“我可以做这样的事情,以便能够在Java中引用一个假通行证”*:呃,不,你不能。 –

+0

@ T.J.Crowder感谢您的通知。我在问题主体中改变了我的问题和一些细节。 –

回答

0

猜测问题:是的,Android SDK使用的事实是,尽管Java没有传递引用(没有办法让一种方法伸手去修改一个变量传递给它),变量中的值,或传递给函数等等,用于对象(包括数组)不是对象本身;这是一个值,表示对象在其他地方,在内存中的位置。因此该对象的状态可以通过接收对该对象的引用的函数进行修改。在你提到的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引用的对象的状态,因为该引用是可以传递的值。

相关问题