将对象的值分配给另一个 - 它们不能将相同的地址指向内存

时间:2011-03-16 20:54:15

标签: java memory variable-assignment

我在获取对象的新值时遇到问题。我有这样的代码:

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

我该怎么做?

3 个答案:

答案 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();