在不更改其他实例的情况下更改实例的值

时间:2014-08-12 07:39:44

标签: java

对于那些读过我first question的人,我想我发现了问题所在。问题出在mutate方法中,尤其是在这条指令中:

Chromosom ch=new Chromosom(); // Chromosom is a class who use hash table  
Chromosom k= new Chromosom(); // Class chromosom extends  hashmap <integer,parc>
k.initialise(); 
for(int i=0;i<l.size();i++) ch.put(i,k.get(i)); // in this instruction i think

这是Chromosom的构造函数:

public Chromosom(){   // construct a blank chromosom
    super();
    this.identifiant = 0;
    NbEquipeExterne = 0;
    NbEquipeInterne = 0;
    CoutMinimal = 0;
    CoutMensuel = 0;
}

当我更改ch的值时,k的值也会改变?

如何通过复制而不是引用k的值传递给ch

2 个答案:

答案 0 :(得分:0)

首先,Java is always pass-by-value.或更确切地说传递给变量值的副本不通过引用传递。您可能正在构造函数中使用Chromosom更改k的对象。

答案 1 :(得分:0)

没有危险,chk都是单独的对象。

此外你可以做到

ch.putAll(k);

这是一个很好的捷径。

<强> 买者

  1. 如果地图的值是有状态对象(包含可变字段以包含某些更改信息),则更改该字段将更改两个表中的simgle值对象的字段。

    BitSet bits = k.get(i);
    bits.set(3);
    // Now ch.get(i) being the same object, also has bit 3 set.
    
  2. 如果一个类有一个static字段,那么该字段每个类只有一个实例。所以你可以说染色体:

    static String copyright;
    
    Chromosome.copyright = "All rights reserved"; // Clearest style
    k.copyright = "All rights given to the community";
    ch.copyright = "MIT license";
    

    你会使用vaklue“麻省理工学院执照”来处理同一个变量。

  3. 关于Java

    在java中做出了一个很好的设计决定:

    • 如果将变量传递给函数/方法,则将传递对象/值。变量本身可能永远不会发生其他对象/值。 (不传递变量的地址。)Java具有传值,没有传递引用。