На самом деле - это копирование значения, но вам необходимо понять, что это за значение.
Значение offspringScheduleOne[0]
не является TimeSchedule
объектом.Это ссылка на TimeSchedule
объект. Ни у одного выражения в Java нет значения, которое является объектом. Очень важно, чтобы вы это поняли.
Теперь, если вам нужна копия объекта, выЯ должен сделать это самостоятельно.Например, вы можете включить метод clone()
в TimeSchedule
и написать:
offspringScheduleOne[i] = genes.get(geneOneIndex).getSchedule()[i].clone();
Другими словами, создать клон существующего объекта, а затем установить offspringScheduleOne[i]
в качестве ссылкик этому вновь созданному объекту.Конечно, если какое-либо из полей в TimeSchedule
является полем ссылочного типа, вам необходимо решить, нужно ли вам клонировать этот объект, а также ...
... или вы можете добавить конструктор и вызвать его, или другой метод, и т. д. Но вам нужно быть абсолютно ясным, что оператор присваивания является копированием значения, но это значение является ссылкой.
РЕДАКТИРОВАТЬ: Хорошо, теперь, когда вы опубликовали TimeSchedule
, несколько предложений:
- Прекратить использование открытых полей.Какой смысл иметь свойства, если поле общедоступно?
Вместо того, чтобы иметь свойства, возвращающие весь массив, измените их для доступа к отдельному часу, например,
public int getTimetable(int day, int hour) {
// TBD: Argument validation
return timetable[day][hour];
}
// Similar for `setTimetable`
Создайте метод клонирования следующим образом:
public TimeSchedule clone() {
TimeSchedule copy = new TimeSchedule();
for (int i = 0; i < timetable.length; i++) {
copy.timetable[i] = timetable[i].clone();
}
return copy;
}
(Это немного расточительно в том смысле, что он создаст подмассивы, а затем отбросит их, но давайте сначала получим что-то, что работает ...)}
public Test clone () {int [] [] scheduleCopy = new int [schedule.length] [];for (int i = 0; i