ich habe eine Klasse, deren Konstruktor folgendermassen lautet:
Code:
...
int[][] quadrat;
int magicsum;
public MagicSquare(int dimension,int[][] quadrat)
{
magicsum = dimension*((dimension*dimension)+1)/2;
this.dimension = dimension;
this.quadrat = (int[][])quadrat.clone();
}
An einer anderen Stelle erstelle ich wiederum ein Array aus eben Objekten dieser Klasse und verändere mit Hilfe eigener public - Methoden (von MagicSquare) das Array "quadrat". Das mache ich, indem ich eine Schleife durchlaufen lasse und somit die einzelnen Objekte anspreche. Problem ist, dass nach dem Schleifendurchlauf alle Objekte dieselben Werte im Array haben.
Ich denke das liegt daran, dass das Array nicht richtig geclont wurde, sondern die einzelnen Objekte jeweils nur einen Verweis auf das übergebene Array besitzen. Ich dachte allerdings, dass man richtige Kopien mit clone() (oder arraycopy() )erstellt. Oder wie soll das funktionieren.
Ich hoffe ich konnte mich verständlich machen. Danke für eventuelle Antworten.
"clone" ist ein bisschen schwammig definiert, und macht mal das eine, mal das andere...
"arraycopy" erstellt keine neuen Objekte, sondern kopiert nur den Link.
Du musst selbst eine Schlaufe machen, die dir einen neuen Array erstellt. (Du kannst ja "clone" im Quadrat selber implementieren :wink: )
Code:
Quadrat[] newArray = new Quadrat[...];
for( ... )
newArray[i] = new Quadrat( ... );
ich bin mir nicht ganz sicher, ob Du mich verstanden hast. Ich galube ich habe das schon gemacht, was du geschrieben hast. Nochmal kurz: Ich habe eine Klasse MagicSquare (Konstruktor siehe oben), von der jeder ihrer Instanzen ein Array enthält. Von dieser Klasse erstelle ich mehrere Instanzen und speichere auch diese wieder in ein Array. Das mache ich so:
Code:
...
kinder = new MagicSquare[lambda];
// elter ist ebnefalls vom Typ MagicSquare und bekannt.
}
public void muLambdaStrategie()
{
for (int i=0; i<lambda; i++)
{
kinder[i]=new MagicSquare(elter.dimension,elter.quadrat);
kinder[i].shift2Numbers();
}
kinder[0].quadrat[0][0]=0;
for (int i=0; i<lambda; i++)
{
kinder[i].showSquare(); //gibt einfach quadrat aus
}
Letzte Schleife gibt mit für jedes der Kinder an der Stelle [0][0] eine 0 aus, was ja eigentlich nicht sein sollte.