Подтвердить что ты не робот

Java array pass by reference не работает?

Ребята, я думал, что почти весь язык, включая массив java pass, используется в качестве ссылочного (модифицируемого)

но почему-то это не работает. и 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;
   }
}
4b9b3361

Ответ 1

Массив передается по ссылке, но эта ссылка передается по значению. То есть вы можете изменить массив, на который ссылается a, но вы не можете изменить, к какому массиву относится a.

Ответ 2

Java передается по значению. Вот почему ваш код не работает. Хорошей практикой было бы отметить int[] a как final, поэтому это приведет к ошибке компиляции (см. Соответствующее правило проверки).

Ответ 3

вернуть параметр "a" из функции и назначить testArray в основной функции. Когда вы передаете объект по ссылке, ссылка копируется и передается функции. Таким образом, объект теперь ссылается на 2 ссылки. Любые изменения в объекте через 2-ю ссылку будут отражены в первой ссылке, потому что это тот же объект, на который ссылаются оба из них. Но когда вы меняете ссылку (а не объект через ссылку), это другой случай. вы изменили вторую ссылку на точку на другой объект (результат int []). Таким образом, любые изменения во 2-й ссылке будут изменять только объект "результат".

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;
   }
}

Ответ 4

Когда вы делаете a = result; объект a dosnt больше указывает на testArray, bc, вы меняете ссылку на result. Вот почему это dosnt больше влияет на testArray. Фактически, вы делаете a тот же адрес, что и результат, поэтому, что бы вы ни изменили в a, он изменится в результат.

Надеюсь, это помогло...

Ответ 5

Массив, на который ссылается a, может быть изменен, но сама ссылка передается по значению. Итак, если вы сделали a[0] = 1, вы бы изменили исходный массив. Однако a = result изменяет ссылку, поэтому исходная ссылка не изменяется.

Ответ 7

Массивы - это объекты в java. Если вы инициализировали массив с размером (фактически длина), вы не можете его изменить. Вы можете создать новый массив с переменным размером (как вы сейчас делаете в функции) и скопировать все значения из старого массива в новый массив. В вашем случае у вас есть 2 объекта и 3 ссылки. Если вы хотите получить доступ к массиву большего размера в вызывающей функции, заставьте функцию вернуть ссылку массива большего размера.

Ответ 8

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();
    }
}

----- ВЫВОД -----

15 2 -3

16 3 -2