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

28 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;
   }
}
Run Code Online (Sandbox Code Playgroud)

Dea*_*ing 51

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


Tay*_*ese 7

Java是按值传递的.这就是您的代码不起作用的原因.一个好的做法是标记int[] afinal这样会导致编译错误(参见相应的Checkstyle规则).


Suj*_*jee 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;
   }
}
Run Code Online (Sandbox Code Playgroud)