2017-08-26 90 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引用的對象的狀態,因爲該引用是可以傳遞的值。

相關問題