类实例更改另一个实例

时间:2014-08-11 12:02:43

标签: java

代码是:

package classes;

public class Test {
    private static double mutationRate = 0.5;

    public static void main(String[] args) {
        Population pop = new Population();
        pop.initialise();
        Population po = new Population();
        po.getIndividusList().add(pop.getFittest());
        po.getIndividusList().add(mutate(pop.getIndividusList().get(1)));
    }

    private static Chromosom mutate(Chromosom l) { // changer les couples d'interventions des parcs)
        // loop through genes
        Chromosom ch = new Chromosom();
        for (int i = 0; i < l.size(); i++)
            ch.put(i, l.get(i));

        for (int i = 0; i < ch.size(); i++) {
            double alea = Math.random() * 13;
            int moisIntervention1 = (int) alea;

            Intervention interv1 = new Intervention(1, moisIntervention1);
            ch.get(i).modInterventions(ch.get(i).intervention2(interv1));
        }
        return ch;
    }
}

问题是我没有更改实例pop,但是当我更改另一个实例po时,pop也会更改。

2 个答案:

答案 0 :(得分:1)

java按值传递。

当您拨打此mutate(pop.getIndividusList().get(1))

你正在发送pop的实例,所以它会得到改变。

pop.getIndividusList().get(1)以这种方式返回String varibale

String var=pop.getIndividusList().get(1);

然后致电mutate(var)

答案 1 :(得分:0)

我不确定我是否理解这个问题,但我认为您的意思是当您更改人口po中的项目时,人口pop中的项目会反映这些更改。< / p>

确实,您的代码的预期行为:要填充po,您要添加来自pop - (pop.getFittest, pop.getList.get(1) )的项目。

但我相信,这些人是对象的实例,因此添加/删除和类似的操作与对象的引用一起工作,而不是对它们的副本。因此,当您有2个对同一个obj的引用时,任何更改都会被镜像。

如果要创建副本,则应通过创建将另一个实例作为参数,实现复制方法或类似内容的构造函数,向po添加具有相同状态的新对象。 / p>

它应该是这样的:

    Population po = new Population();
    Individual fittest = pop.getFittest();
    Individual poCopy = new Individual();
    //ADD CODE HERE TO COPY ALL THE FIELDS FROM fittest TO poCopy
    //....

    po.getIndividusList().add(poCopy);