方法(Mover)属于一个Estado类,它描述了一个滑动拼图的状态,它带有一个矩阵表(板)和一个跟踪空位的变量hueco(空洞)。问题是函数改变了原始Estado的值,并且它不应该。有人可以告诉我,我做错了什么吗?
public class Estado {
public int dim;
public int tablero[][];
public int hueco[]= new int[2];
public Estado(int dim,int tablero[][],hueco){
this.dim=dim;
this.tablero=tablero;
this.hueco=hueco;
}
public Estado(){}
//moves empty tile to one of 4 option(up,down,right,left)
(up,down,right,left)
//
public Estado mover(String direccion,Estado estado){
Estado sig= new Estado();
sig.tablero=estado.tablero;
sig.dim=estado.dim;
sig.hueco=estado.hueco;
estado.mostrarTablero();
switch (direccion){
case "up":
sig.tablero[estado.hueco[0]][estado.hueco[1]]=sig.tablero[estado.hueco[0]+1][estado.hueco[1]];
sig.tablero[estado.hueco[0]+1][estado.hueco[1]]=0;
sig.hueco[0]=estado.hueco[0]+1;
break;
default:
//cases "down,right and left" omitted, very similar to "up"
break;
}
return sig;
}
}
答案 0 :(得分:1)
问题是变量sig
指向参数tablero
的相同数组hueco
和estado
,因为这些语句:
sig.tablero=estado.tablero;
sig.hueco=estado.hueco;
当您调用mover
方法时,Java会传递“指针”的副本,但不会传输阵列结构的平面副本(copia plana)。
也许您更喜欢了解主题按值传递,传递引用以及制作平面副本的含义。
编辑: 我从Programmers StackExchange那里得到这个,这可以帮助你理解:
Java是按值传递的。可以把它想象成像C这样的指针语言,指针(内存地址)的值被传递,因此您可以引用同一个对象。基元的内部存储方式与对象不同,因此当传递基元的值时,它是内容,而不是指针。