Java 如何存储变量以使其能够';不能修改吗?

Java 如何存储变量以使其能够';不能修改吗?,java,Java,对不起,如果我把这个问题的格式弄错了,这是我的第一篇文章 本质上,我的问题是,我将一个对象指定为变量,然后更改原始对象,然后尝试使用该变量将对象恢复到其原始状态。然而,我经常发现,尽管从未对变量调用过方法,但变量本身已更改为与对象现在的外观完全相同 我试图存储的对象是b,看起来发生了变化的变量既是存储变量又是原始变量。我调用了original上的方法,但没有人应该更改它,只是从中接收信息。我在商店里不调用任何方法 如何,当我尝试执行b=存储时;我能否确保b与参数中传递给它的b相同 该方法的代码如

对不起,如果我把这个问题的格式弄错了,这是我的第一篇文章

本质上,我的问题是,我将一个对象指定为变量,然后更改原始对象,然后尝试使用该变量将对象恢复到其原始状态。然而,我经常发现,尽管从未对变量调用过方法,但变量本身已更改为与对象现在的外观完全相同

我试图存储的对象是b,看起来发生了变化的变量既是存储变量又是原始变量。我调用了original上的方法,但没有人应该更改它,只是从中接收信息。我在商店里不调用任何方法

如何,当我尝试执行b=存储时;我能否确保b与参数中传递给它的b相同

该方法的代码如下所示:

public int getMove(Board b, int playerNum) throws QuitGameException{        
    original = b;
    store = b;
    int otherPlayerNum = 0;
    try{
        out.println("In house 2 on our side " + original.getSeeds(2, playerNum));
    } catch (Exception e){
        out.println("problem");
    }
    try{
        out.println("In house 2 on our side " + store.getSeeds(2, playerNum));
    } catch (Exception e){
        out.println("problem");
    }


    //Prints the current board to the user in a textual interface
    if(playerNum == 1){
        otherPlayerNum = 2;
    } else {
        otherPlayerNum = 1;
    }

    out.println("Opponent's side: ");
    for(int i=6;i>0;i--){
        try{
            out.print("House " + i + " : [" + original.getSeeds(i, otherPlayerNum)+ "] ");
        } catch (InvalidHouseException e){
            out.print("Invalid house");
        }
    }
    out.println();
    out.println("Opponent's score: " + original.getScore(otherPlayerNum));

    out.println("Computer's side: ");
    for(int i=1;i<7;i++){
        try{
            out.print("House " + i + " : [" + original.getSeeds(i, playerNum) + "] ");
        } catch (InvalidHouseException e){
            out.print("Invalid house");
        }
    }
    out.println();
    out.println("Computer's score: " + original.getScore(playerNum));

    //Each move is tried so that the score can be received, the move which produces the highest score is chosen to be returned.
    System.out.println(b.toString());
    int highestScore = b.getScore(playerNum);
    int bestHouse = 0;
    boolean moveFound = false;
    int move = 1;
    int score = 0;
    for(int i =1; i<7 ;i++){
        try{
            b.makeMove(i,playerNum);
            score = b.getScore(playerNum);
        } catch (Exception e){
            out.println("a problem");
            score = 0;
        }

        if(score>highestScore){
            bestHouse = i;
            highestScore = score;
            moveFound = true;
            move = i;
        }
        try{
            System.out.println("Seeds in side " + playerNum + " and house " +i+" = "+original.getSeeds(i, playerNum));
        } catch (Exception e){
            out.println("problem");
        }            
        b = original;
    }
    try{
        out.println("In house 2 on our side " + original.getSeeds(2, playerNum));
    } catch (Exception e){
        out.println("problem");
    }
    try{
        out.println("In house 2 on our side " + store.getSeeds(2, playerNum));
    } catch (Exception e){
        out.println("problem");
    }
    out.println("All okay? "+b.equals(store));
    out.println("All okay? "+original.equals(store));
    int side = playerNum;
    int bestScore = 0;
    int seeds = 0;

    //If no move has been found which increases the score then the first house with a seed in it is chosen to be returned
    if(!moveFound){
        for (int i =1; i<7 ;i++){
            try{
                seeds = original.getSeeds(i,playerNum);
                System.out.println("Seeds = "+ seeds);
                if (seeds>0 && !moveFound){
                    move = i;
                    moveFound = true;
                }
            } catch (Exception e){
                seeds = 0;
            }
        }
    }
    return move;

}
public int getMove(Board b,int playerNum)抛出QuitGameException{
原始=b;
存储=b;
int-otherPlayerNum=0;
试一试{
out.println(“我们这边的第二家”+original.getSeeds(第二家,playerNum));
}捕获(例外e){
out.println(“问题”);
}
试一试{
out.println(“我们这边的2号房子”+store.getSeeds(2,playerNum));
}捕获(例外e){
out.println(“问题”);
}
//以文本界面向用户打印当前电路板
如果(playerNum==1){
otherPlayerNum=2;
}否则{
otherPlayerNum=1;
}
out.println(“对手方:”);
对于(int i=6;i>0;i--){
试一试{
打印(“House”+i+:[“+original.getSeeds(i,otherPlayerNum)+“]);
}捕获(无效){
打印(“无效房屋”);
}
}
out.println();
out.println(“对手分数:+原始.getScore(其他玩家的分数));
out.println(“计算机端:”);

对于(int i=1;i变量不包含对象。它们包含对对象的引用(或指针,如果您愿意)。将对象分配给变量不会创建对象的任何副本。它只是使变量指向此对象:

Board b = new Board();
                b ------> board object

Board store = b;
这将创建一个Board对象,并使
b
变量指向该对象:

Board b = new Board();
                b ------> board object

Board store = b;
这将同一线路板对象分配给另一个变量
store
。因此
b
store
现在都指向线路板对象

                b ------> board object
                             ^
                store -------|
因此,如果您不执行类似于
b.setName(“新名称”)
的操作,您将修改board对象的状态,并且由于
b
和store都引用了相同的board对象,因此调用
store.getName()
将返回新名称:

                b ------> board object with new name
                             ^
                store -------|
如果您想要一个变量保持原始板状态,则需要创建板对象的副本:

Board store = new Board(b);
此构造函数应复制作为参数的电路板上的所有内容:

public Board(Board other) {
    this.name = other.getName();
    ...
}

变量不包含对象。它们包含对对象的引用(或指针,如果您愿意)。将对象分配给变量不会创建对象的任何副本。它只是将变量指向此对象:

Board b = new Board();
                b ------> board object

Board store = b;
这将创建一个Board对象,并使
b
变量指向该对象:

Board b = new Board();
                b ------> board object

Board store = b;
这将同一线路板对象分配给另一个变量
store
。因此
b
store
现在都指向线路板对象

                b ------> board object
                             ^
                store -------|
因此,如果您不执行类似于
b.setName(“新名称”)
的操作,您将修改board对象的状态,并且由于
b
和store都引用了相同的board对象,因此调用
store.getName()
将返回新名称:

                b ------> board object with new name
                             ^
                store -------|
如果您想要一个变量保持原始板状态,则需要创建板对象的副本:

Board store = new Board(b);
此构造函数应复制作为参数的电路板上的所有内容:

public Board(Board other) {
    this.name = other.getName();
    ...
}

你能用final吗?听说过变量吗?如果我把store赋值为final,这是否意味着我对它所做的任何事情都不会改变它?仅仅因为我需要store在方法开始时变为等于b,然后在这一点之后再也不会改变。你能使某个东西成为final吗?或者它总是必须是final吗?这是最后当你之前调用store=b时,你为什么会调用b=store?你能用final吗?你听说过变量吗。如果我将store指定为final,这是否意味着我对它所做的任何事情都不会改变它?仅仅因为我需要store在方法开始时变为等于b,然后在那之后再也不会改变。你能做点什么吗final?还是它总是必须是final?这是final的唯一目的当你之前调用store=b时,你为什么会调用b=store?