2015-11-04 57 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类的对象时,它将通过引用传递。

因此,改变数组的值将被反映在两个地方,而一个整数,不会。

此答案可以接受任何建议。如果有人发现任何不准确的地方,请随时提出修改建议。