创建一个变量的别名/引用(JAVA)

5
我很久以来一直在使用C++,现在对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
    ...
}

temp是myVariable的拷贝还是引用?

如何获取它的拷贝/引用?


那么没有办法节省一些内存并获取到 myVariable 的引用/指针吗? - Arcyno
Java始终是传值调用。请阅读https://dev59.com/EXVD5IYBdhLWcg3wQJOT,因此它是内存安全的。 - AbuHayA
4个回答

6

在你的例子中只有一个int[]。根本没有复制。方法getVar返回的是对象的引用。

在这一行之后:

int[] temp = myObject.getvariable();

“temp”和“myVariable”都是指向同一个对象的引用。可以通过执行例如temp[0] = 9;来测试此内容。更改将在两个地方都可见。

如果您想要复制一个数组,可以使用array.clone()Arrays.copyOf(array, array.length)System.arraycopy(...)之一,但这些方法都没有在您的示例中使用。


这个答案对我来说似乎是正确的,但它与其他答案不符:修改 temp[0] 会影响到我的对象中的 myVariable[0] 吗? - Arcyno

3
这可能会让你感到困惑,因为与C不同,Java只是“按值传递”。所以你不会有指向该对象的引用,而只有一份副本,如果你对该变量进行任何修改,原始值将不受影响。请参阅此问题以获取更多详细信息:Java是“传递引用”还是“传递值”? 编辑 更具体地说,在你的示例中,你实际上会得到一个数组的引用。但是仍然不像C指针那样。你之所以获得引用,仅仅是因为你要复制的实际值本身就是一个引用。正如我所说,你可以在上面的链接中找到更详细的解释。

那么没有办法节省一些内存并获取到 myVariable 的引用/指针吗? - Arcyno
@Arcyno 你可能想看一下这个:https://dev59.com/KHI-5IYBdhLWcg3wpaF1 - Aurasphere

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类的对象时,它将按引用传递。
因此,改变数组的值将在两个位置反映出来,而改变整数的值则不会。
此答案可接受任何建议。如果有人发现任何不准确之处,请随时提出修改建议。

1

您的类MyClass中存在错误,您将会遇到编译错误类型不匹配:无法从int[]转换为double。您需要将方法的返回类型更改为int[],像这样:

public int[] getVar(){
return myVariable;

}

JAVA始终是按值传递


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接