2015-11-04 72 views
3

我已經使用了很多C++的,我與Java的工作方式很困惑: 如果我有一類創建一個變量(JAVA)的別名/參考

public class MyClass{ 
    private int[] myVariable; 
    ... 

    public int[] getVar(){ 
     return myVariable; 
    } 
} 

,然後我想在其他地方使用我的變量:

public static void main(String[] args){ 
    MyClass myObject = new MyClass(); 
    ... 
    int[] temp = myObject.getvariable(); 
    // use of temp 
    ... 
} 

是臨時拷貝還是myVariable的引用?

你如何得到一份副本/參考?

+0

所以沒有辦法保存一些內存並獲得一個引用/指向'myVariable'? – Arcyno

+0

Java始終是按值傳遞的。閱讀http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value因此它是內存安全的 – AbuHayA

回答

4

您的示例中只有一個int[]。根本沒有複製。方法getVar返回的內容是對該對象的引用。

int[] temp = myObject.getvariable(); 

tempmyVariable之後是對同一個對象的引用。您可以通過執行temp[0] = 9;。更改將在兩個地方都可見。

如果你想複製一個數組,你可以使用array.clone(),Arrays.copyOf(array, array.length)System.arraycopy(...)之一,但在你的例子中沒有使用它們。

+0

其實,在這個特定的情況下,你是對的。 – Aurasphere

+0

這個答案對我來說似乎是正確的,但它不適合其他人:'temp [0]'的修改會影響我的objet中的'myVariable [0]'? – Arcyno

+1

@Arcyno是的,它會。 –

3

這會讓你感到困惑,因爲不像C,Java只有傳遞值。所以你不會有對該對象的引用,但只有一個副本,然後如果你對該變量進行任何修改,原始內容不會受到影響。看到這個問題的更多細節:Is Java "pass-by-reference" or "pass-by-value"?

編輯

更具體地講,在你的榜樣,你會真正得到參考到陣列。但是,這仍然不像C指針。你只能得到一個參考,因爲你正在拷貝它的實際值是一個參考本身。正如我所說的,你可以在上面的鏈接中找到更詳細的解釋。

+0

所以沒有辦法保存一些內存,並得到一個參考/指向'myVariable'的指針? – Arcyno

+0

@Arcyno你可能想看看這個:http://stackoverflow.com/questions/1750106/how-can-i-use-pointers-in-java – Aurasphere

1

您的類MyClass中存在錯誤,您將遇到編譯錯誤類型不匹配:無法從int []轉換爲double。你必須改變你的方法的返回類型爲int []這樣的:

public int[] getVar(){ 
return myVariable; 

}

JAVA總是傳遞按值

2

我可以看到什麼是混淆了你,讓我告訴你一個例子。

MyClass.java

public class MyClass { 
    private int i; 
    private int[] a; 

    public void setI(int i){ 
     this.i = i; 
    } 
    public void setA(int a[]){ 
     this.a = a; 
    } 

    public int getI(){ 
     return i; 
    } 
    public int[] getA(){ 
     return a; 
    } 
} 

Test.java

public class Test { 

    public static void main(String[] args) 
    { 
     int a[] = {1,2}; 
     MyClass myClass = new MyClass(); 
     myClass.setI(5); 
     myClass.setA(a); 

     int i = myClass.getI(); 
     int b[] = myClass.getA(); 

     System.out.println(myClass.getI()); 
     System.out.println(myClass.getA()[0] + " " +myClass.getA()[1]); 

     i = 10; 
     b[0] = 3; 
     b[1] = 4; 

     System.out.println(myClass.getI()); 
     System.out.println(myClass.getA()[0] + " " +myClass.getA()[1]); 
    } 
} 

當你看到上面的代碼,你就會明白的輸出,原始的類型,如整數始終按值傳遞在Java中。但是,當你傳遞數組或其他對象,如Calendar類的對象時,它將通過引用傳遞。

因此,改變數組的值將被反映在兩個地方,而一個整數,不會。

此答案可以接受任何建議。如果有人發現任何不準確的地方,請隨時提出修改建議。