Не связана ли переменная экземпляра массива с приемом метода установки? - PullRequest
0 голосов
/ 27 июня 2019

В основном методе я создаю новый объект DotComClass и устанавливаю массив locationOfShips на 14 номеров. Затем отправьте эти значения как аргумент для метода сеттера (setLocations) в другом классе (увидеть ниже). Мой вопрос: почему это позволяет это пройти без вопрос, так как я установил максимальное количество элементов локаций переменная экземпляра 5?


  import java.util.Arrays;

  public class Main {
    public static void main(String[] args) {
      DotComClass dotCom = new DotComClass();
      int[] locationOfShips = {6,7,8,9,1,2,3,4,4,4,4,5,5,5};        
      dotCom.setLocations(locationOfShips);       
    }
  }

  public class DotComClass {
   int [] locations = new int[5]; // is this not related to the locations in the setter?

   public void setLocations (int[] locations){
     this.locations= locations;
     System.out.println(Arrays.toString(locations));
     }
  }

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Поле locations является ссылкой на массив.

Это указывает на новый массив из 5 целых чисел.

int [] locations = new int[5]; // is this not related to the locations in the setter?

Это указывает, что ссылается на другой массив.

this.locations= locations;

Новый массив имеет свой собственный размер. Он не ограничен размером массива, на который ранее ссылалась ссылка.

0 голосов
/ 28 июня 2019

Есть простая ошибка, которую вы делаете, переменная int [] locations = new int[5]; на самом деле не содержит массив длины 5. Она просто содержит ссылку на массив длины 5 где-то в куче.

Именно это и делает следующее утверждение,

int[] locationOfShips = {6,7,8,9,1,2,3,4,4,4,4,5,5,5};

поэтому, когда вы запускаете this.locations= locations;, вы фактически говорите, что переменная теперь ссылается на массив locationOfShips

Если это не ясно, я предлагаю вам прочитать хорошее объяснение о передаче по ссылке здесь ( Передаются ли массивы по значению или по ссылке в Java? )

...