Проблема копирования конструктора - PullRequest
0 голосов
/ 26 мая 2018

Я создал класс Robot с двумя свойствами: direction (это просто строка E, A, S, N) и location (массив из 4 целых чисел, которые сохраняют местоположение в обоих направлениях).Класс имеет главный конструктор:

public Robot (int east, int north, int west, int south, int direction) {
this.direction = direction%4 ;
location = new int[4] ;
int[] location = {east,north,west,south} ; }

и конструктор копирования:

Robot( Robot copy ) {
    direction = copy.direction ;
    location = copy.location ;
  }

Также у него есть методы, но я хочу показать эти два метода: move () и setDirection ().

public void move() {
    location[direction]++ ;
  }

public void setDirection( int direction ) {
    this.direction = direction ;
  }

Я создал объект Robot и выровнял его с новым объектом, также использовал другой новый объект с помощью конструктора копирования:

  Robot terminator = new Robot(0,0,0,0,1) ;
  Robot b = terminator ;
  Robot a = new Robot(terminator) ;

Вот проблема, когда я использую Move() для терминатора, a или b, местоположение других меняется, но когда я использую setDirection для терминатора, a не меняется, а b изменяется.Также, когда я использую то же самое с a, ни один из b и направление терминатора не изменяются.Так в чем же разница?Почему метод move (), реализованный на терминаторе, влияет на копию, а при использовании setDirection () - нет?

System.out.println(terminator) ;
System.out.println(a) ;
System.out.println(b) ;

terminator.setDirection(2);
a.setDirection(3) ;
terminator.move() ;

System.out.println(terminator) ;
System.out.println(a) ;
System.out.println(b) ;

Вывод:

Location[0, 0, 0, 0]Direction N
Location[0, 0, 0, 0]Direction N
Location[0, 0, 0, 0]Direction N
Location[0, 0, 1, 0]Direction W
Location[0, 0, 1, 0]Direction S
Location[0, 0, 1, 0]Direction W

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Посмотрите на своего конструктора:

Robot( Robot copy ) {
   direction = copy.direction ; 
   location = copy.location ;
}

Вы делаете мелкую копию здесь.

Ваш direction является примитивным типом, поэтому ваш скопированный Robot получает копиюисходное значение направления Robot.Они не имеют одинаковую ссылку на direction переменную

Между тем, ваш location является массивом, поэтому скопированная Robot получает ссылку на исходное местоположение Robot.Оба Robot имеют одинаковый массив location.Изменение одного влияет на другое.

Если вы хотите разделить два экземпляра Robot, вы должны сделать deep copy массив location.

Вместо:

location = copy.location;

Do:

location = Arrays.copyOf(copy.location, copy.location.length);
0 голосов
/ 26 мая 2018

Оба экземпляра Robot содержат ссылку на одно и то же местоположение int[].Вам необходимо создать новый массив при создании нового экземпляра Robot, например, используя Arrays.copyOf:

Robot( Robot copy ) {
    direction = copy.direction ;
    location = Arrays.copy(copy.location, copy.location.length);
    // Here ---^
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...