每个对象初始化中的实例变量都是相同的

时间:2014-12-29 04:22:02

标签: java arrays member instance-variables

我正在制作一种遗传算法,用于将char的数组演变为“Hello World”。问题是每当我初始化Chromosome对象并调用generateChromosome方法时,“测试”群体的所有染色体都保持不变?

public class Chromosome{
   private static int defaultLength = 11;
   private static char []genes = new char[defaultLength]; <--- this remains the same for each object :/


   //Generates a random char chromosome
   public void generateChromosome(){
      char []newGene =  new char[defaultLength];
      for(int x = 0; x<size(); x++){
         char gene = (char)(32+Math.round(96*Math.random()));
         newGene[x] = gene;

      }
      genes = newGene;

   }

   //Returns a specific gene in the chromosome
   public char getGene(int index){
     return genes[index];
   }

   public char[] getChromosome(){
      return genes;
   }

   public void setGene(char value, int index){

   genes[index] = value;

   }

   public static  void setDefaultLength(int amount){
      defaultLength = amount;
   }

   public static int getDefaultLength(){
      return defaultLength;
   }

   public int size(){
      return genes.length;
   }

   @Override
   public String toString(){
      String geneString = "";
      for(int x= 0; x<genes.length; x++){
         geneString += genes[x];
      }
      return geneString;
   }
}

5 个答案:

答案 0 :(得分:3)

那是因为你的变量是static,即类变量。它们在你班级的每个实例中都是一样的。

如果需要实例变量,请删除static关键字。

答案 1 :(得分:2)

static表示每个类一个(每个实例不是一个)。删除static

private char[] genes = new char[defaultLength];

,您的genes成为实例字段。

答案 2 :(得分:2)

static个成员属于 - 它们在所有实例中共享。您应该通过删除genes关键字

static定义为实例成员
public class Chromosome{
   private static int defaultLength = 11; // should probably be final, BTW
   private char[] genes = new char[defaultLength]; // not static!

答案 3 :(得分:1)

由于您在基因中使用static关键字,因此它不是实例变量。因此,虽然您已将创建的数组分配给它,但将只有一个实例通过应用程序

您可以移除static关键字并使用实例基因变量。

答案 4 :(得分:1)

删除genes关键字,将static设为实例变量。 因为,

1)static表示每个班级一个

2)instance表示每个实例一个

有关static的更多信息, 见https://stackoverflow.com/a/413904/2127125