java数组按引用传递不起作用?

时间:2010-05-14 04:45:17

标签: java

我认为几乎所有语言都包括java将数组传递给函数作为参考(可修改)

但不知怎的,它在这里不起作用。并且testArray仍然是1,2,3,大小为3

奇怪的是,如果我将结果[i] = 2更改为[1] = 2;这行得通 。它确实通过引用传递

这段代码有什么问题?

最后,我有一个=结果; (更新a)。结果从堆栈中删除了。这就是为什么一个仍然得到原来的?

我很困惑。

感谢

class Test
{
   public static void main(String[] args)
   {

      int[] testArray = {1,2,3};
      equalize(testArray, 6);

      System.out.println("test Array size :" + testArray.length);
      for(int i = 0; i < testArray.length; i++)
         System.out.println(testArray[i]);
   }

   public static void equalize(int[] a, int biggerSize)
   {
      if(a.length > biggerSize)
         throw new Error("Array size bigger than biggerSize");

      int[] result = new int[biggerSize];
     // System.arraycopy(a, 0, result, 0, a.length);
     // int array default value should be 0
      for(int i = 0; i < biggerSize; i++)
         result[i] = 2;

      a = result;
   }
}

8 个答案:

答案 0 :(得分:49)

数组通过引用传递,但引用按值传递 。也就是说,您可以更改a引用的数组,但不能更改哪个数组a引用

答案 1 :(得分:6)

Java是按值传递的。这就是您的代码不起作用的原因。一个好的做法是将int[] a标记为final,这样会导致编译错误(请参阅相应的Checkstyle rule)。

答案 2 :(得分:5)

从函数返回参数“a”并在main函数中分配给testArray。通过引用传递对象时,将复制引用并将其提供给函数。因此,该对象现在由2个引用引用。通过第二个引用对象的任何更改都将反映在第一个引用中,因为它们是两个引用的同一个对象。但是当您更改引用(而不是通过引用的对象)时,情况就不同了。您已将第二个引用更改为指向另一个对象(int []结果)。因此,通过第二个引用的任何更改都只会更改“结果”对象。

class Test
{
   public static void main(String[] args)
   {

      int[] testArray = {1,2,3};
      testArray = equalize(testArray, 6);

      System.out.println("test Array size :" + testArray.length);
      for(int i = 0; i < testArray.length; i++)
         System.out.println(testArray[i]);
   }

   public static int[] equalize(int[] a, int biggerSize)
   {
      if(a.length > biggerSize)
         throw new Error("Array size bigger than biggerSize");

      int[] result = new int[biggerSize];
     // System.arraycopy(a, 0, result, 0, a.length);
     // int array default value should be 0
      for(int i = 0; i < biggerSize; i++)
         result[i] = 2;

      a = result;
      return a;
   }
}

答案 3 :(得分:4)

a =结果; 对象 a dosnt再指向 testArray 时,bc您正在更改其对的引用结果的地址。这就是为什么它会再次影响 testArray 。 实际上你在做的是 a 结果相同的地址,所以无论你在 a 中改变什么,它都会在结果。

希望这有助于......

答案 4 :(得分:2)

可以修改a引用的数组,但引用本身是按值传递的。因此,如果您执行了a[0] = 1,那么您将更改原始数组。但是,a = result会更改引用,因此原始引用不会更改。

答案 5 :(得分:1)

答案 6 :(得分:0)

数组是java中的对象。如果已使用大小(实际长度)初始化数组,则无法对其进行修改。您可以创建一个具有不同大小的新数组(正如您当前在该函数中所做的那样),并将旧数组中的所有值复制到新数组。在您的情况下,您有2个对象和3个引用。如果要在调用函数中访问更大尺寸的数组,请使该函数返回更大尺寸的数组的引用。

答案 7 :(得分:0)

public class test
{
    public static void main(String[] args){
        int[] a = {15, 2, -3};
        printArray(a);
        changeArray(a);
        printArray(a);
    }
    private static void changeArray(int[] a){
        for(int i = 0; i < a.length; i++){
            a[i]++;
        }
    }

    private static void printArray(int[] a){
        for(int i = 0; i < a.length; i++){
            System.out.print(a[i] + " ");
        }
        System.out.println();
    }
}

- - - - - - - - OUTPUT

15 2 -3

16 3 -2