我有这个对象,我将其标记为父对象,我想创建该对象的副本,我称之为子对象(方法生成子对象)。我通过将父对象的属性传递给构造函数来实现副本当我实例化孩子的时候。我一直遇到的问题是,当我通过调用update方法编辑子进程时,父进程会发生相同的修改。我需要父母保持不变让位给更多副本,这可能是什么问题?任何帮助表示赞赏:)
import javax.swing.*;
import java.util.*;
public class State
{
private int[][] switches;
private int[][] lights;
private int numMoves;
public State(int[][] initSwitches,int[][] initLights,int numMoves)
{
this.switches = initSwitches;
this.lights = initLights;
this.numMoves = numMoves;
}
public int[][] getSwitches()
{
return switches;
}
public int[][] getLights()
{
return lights;
}
public int getNumMoves()
{
return numMoves;
}
public void updateState(int row, int col)
{
this.toggleSwitch(row,col);
this.toggleLight(row,col);
if(row+1 <= 4)
{
this.toggleLight(row+1,col);
}
if(row-1 >= 0)
{
this.toggleLight(row-1,col);
}
if(col+1 <= 4)
{
this.toggleLight(row,col+1);
}
if(col-1 >= 0)
{
this.toggleLight(row,col-1);
}
}
public void toggleSwitch(int row, int col)
{
if(this.switches[row][col] == 1)
{
this.switches[row][col] = 0;
}
else if(this.switches[row][col] == 0)
{
this.switches[row][col] = 1;
}
}
public void toggleLight(int row,int col)
{
if(this.lights[row][col] == 1)
{
this.lights[row][col] = 0;
}
else if(this.lights[row][col] == 0)
{
this.lights[row][col] = 1;
}
}
public State[] generateChildren(int numChildren)
{
int count = 0;
State[] children = new State[numChildren];
for(int i=0;i<numChildren;i+=1)
{
children[i] = new State(this.switches,this.lights,0);
}
for(int i=0;i<5;i+=1)
{
for(int j=0;j<5;j+=1)
{
if(this.switches[i][j] == 0)
{
children[count].updateState(i,j);
LightsOutSolver.printState(children[count]);
count+=1;
}
}
}
return children;
}
}
答案 0 :(得分:0)
当您创建子项时,您传递给新状态矩阵切换和灯光的相同引用,因此它们在父项和子项中都是完全相同的对象。 你需要一份深刻的副本。 没时间解释,看看这个How do I do a deep copy of a 2d array in Java?