【发布时间】:2016-03-15 12:21:05
【问题描述】:
我对 Java 中的递归有点困惑:
public int recursion(Board board2,int x){
Board board1 = board2;
if(x==3){
System.out.println("End");
return 0;
}
board1.fix(obj, Color.BLUE, x, 12);
return recursion(board1, x+1);
}
这只是将对象放入板中的示例。如何更改board1,但不能更改我作为参数传入的原始板?由于在方法之外,我作为参数传递的Board在执行后发生了变化,我不明白为什么。我正在阅读Java通过值而不是引用传递。我想让程序在递归过程中恢复到之前的状态,而不是改变真正的板子。
编辑
我试过这样,还是不行:
public int recursion(Board board2,int x){
try{
board1 = (Board)board2.clone();
}catch (Exception e){
System.out.println("Error "+e);
}
if(x==3){
System.out.println("End");
return 0;
}
board1.fix(obj, Color.BLUE, x, 12);
return recursion(board1, x+1);
}
编辑 2
这是我实现克隆方法的方式
class Board extends JPanel implements Cloneable{
// ...
@Override
protected Board clone() throws CloneNotSupportedException{
return(Board) super.clone();
}
// ...
编辑 3
我仍然无法让它工作
class Board extends JPanel implements Cloneable{
public Color[][] board;
@Override
public Board clone(){
Board board1 = new Board();
board1.board = this.board;
return board1;
}
// ...
}
【问题讨论】:
-
board1包含与board2相同的引用,因此它们指向同一个确切的对象。引用(对象的地址)按值传递。 -
如果对象的副本是按值传递的,那么递归对于后续调用将不起作用。
标签: java recursion pass-by-reference pass-by-value