我在获取对象的新值时遇到问题。我有这样的代码:
...
TimeSchedule[] offspringScheduleOne = new TimeSchedule[AVAILABLE_CLASSROOMS];
...
offspringScheduleOne[i] = genes.get(geneOneIndex).getSchedule()[i];
...
在该任务之后,offspringScheduleOne [i]和genes.get(geneOneIndex).getSchedule()[i]指向相同的内存地址。我希望如此:offspringScheduleOne[i]
应该获得genes.get(geneOneIndex).getSchedule()[i]
的值,它们不一样,它们应该具有相同的值。
TimeSchedule课程:
public class TimeSchedule extends AlgorithmParameters {
public int[][] timetable = new int[DAYS][HOURS];//DAYS and HOURS are static final variables that comes from AlgorithmParameters
public int[][] getTimetable() {
return timetable;
}
public void setTimetable(int[][] timetable) {
this.timetable = timetable;
}
}
我该怎么做?
答案 0 :(得分:1)
您应该创建一个新的TimeSchedule对象。假设你有一个拷贝构造函数,你可以使用它:
TimeSchedule original = genes.get(geneOneIndex).getSchedule()[i];
TimeSchedule copy = new TimeSchedule(original);
offspringScheduleOne[i] = copy;
构造函数应该复制原始值。如果您没有这样的构造函数,可以调用get和set方法来手动复制值。
TimeSchedule original = genes.get(geneOneIndex).getSchedule()[i];
TimeSchedule copy = new TimeSchedule();
copy.setFoo(original.getFoo());
copy.setBar(original.getBar());
// etc...
offspringScheduleOne[i] = copy;
还有clone
方法用于创建对象的副本,但使用起来很尴尬,最好避免使用它。
答案 1 :(得分:1)
实际上正在复制该值 - 但您需要了解该值是什么。
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 [] [] timetableCopy = new int [timetable.length] []; for(int i = 0; i&lt; timetable.length; i ++){ timetableCopy [i] = timetable [i] .clone(); } return null; }
答案 2 :(得分:0)
您可以让TimeSchedule覆盖克隆方法并编写
offspringScheduleOne[i] = genes.get(geneOneIndex).getSchedule()[i].clone();