Java参考与价值

时间:2018-05-16 21:09:35

标签: java arrays reference

新手问题。试图了解Java中的引用与值参数,请考虑以下内容:

//Helper function int[] to csv    
public static String csv(int[] values){
    String ret = "";
    for(int i = 0; i < values.length; i++)
        ret = String.format("%s%s%s",ret,i == 0 ? "" : ", ",values[i]);
    return ret;
}

//Helper function, print to console
public static void print(int[] v){
    System.out.println(csv(v));
}



public static void method1(int[] input){
    input[0] = 3; input[1] = 4; input[2] = 5;
}

public static void method2(int[] input){
    input = new int[]{6,7,8};
}

public static void main(String[] args) throws Exception {
    int[] original = {0,1,2};
    print(original);

    method1(original);
    print(original);   //As expected

    method2(original);
    print(original);   //Modification ignored
}

在上面,存储了对方法1中数组的更改,但在方法2中,函数内部的新赋值不会影响原始数组,因此具有局部范围。

那么如果我需要对通过引用传递的数组执行数组调整大小操作呢?这在java中是不可能的吗?

1 个答案:

答案 0 :(得分:2)

Java中的所有参数都是通过副本传递的。问题是,副本是什么?对于包括数组的对象,将复制对象引用。您现在有两个对同一对象的引用,因此可以修改该对象。

在method2中,参数&#34;输入&#34;最初设置为对数组的对象引用。然后你修改&#34;输入&#34;指向另一个数组。这对呼叫者没有影响。如果您已离开&#34;输入&#34;单独使用它来改变元素,然后你会看到调用者的变化。