Java:递归和按值传递

标签 java recursion pass-by-reference pass-by-value

我对 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;  
    }
    // ...
}   

最佳答案

在该方法中,参数 board2 持有与您传递给该方法的参数相同的引用。而且我猜你不希望它是这样的。你想要一份具有相同但不同引用的棋盘副本,这样你对副本所做的影响就不会影响你传入的参数。我说得对吗? (我能读懂你的想法!)

clone() 方法最适合这种情况!首先,在 Board 类中,实现 Cloneable

public class Board implements Cloneable {

}

然后给它添加clone()方法。

它的实现大致是这样的:

  1. 创建类的新实例

  2. this中找到的所有字段分配给新实例

  3. 返回新实例。

关于Java:递归和按值传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34192168/

相关文章:

c++ - 通过引用传递 vector 然后调用清除

c++ - 可以安全地将 const & 返回给 const & 传递的对象吗?

java - 有没有办法通过 API 重置 Kafka 消费者组的偏移量?

java - JPanel 未显示

java - 写入 Fusion Table 时收到 "Rate Limit Exceeded"

c++ - 关于如何处理有向图的想法

c++ - 如何创建返回与函数具有相同签名的仿函数的函数?

java - String s = new String(s.getBytes ("UTF-8") ,"UTF-8"); 之间有什么区别?和 String s = new String(s.getBytes() ,"UTF-8");

java - 请再次帮助家庭作业。递归乘以偶数?

c++在程序中使用私有(private)类数据