有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    java按值传递

    当你调用这个mutate(pop.getIndividusList().get(1))

    您正在发送pop的实例,因此它将得到更改

    Suposepop.getIndividusList().get(1)returnString varibale这样做

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

    然后调用mutate(var)

  2. # 2 楼答案

    我不确定我是否理解这个问题,但我认为您的意思是,当您更改Populationpo中的项目时,Populationpop中的项目反映了这些更改

    这确实是代码的预期行为:要填充po,您需要从pop-(pop.getFittest, pop.getList.get(1) )添加项

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

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

    应该是这样的:

        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);