对象分配问题

时间:2016-02-24 10:40:23

标签: java oop object reference

我在分配对象时遇到问题,该对象会生成一个引用副本,用于更改原始对象中的值。

这是我的 原始对象

>>> value = [1, 2, 3, 4]
>>> ''.join(['{:02x}'.format(x) for x in value])
'01020304'

在deque数据结构中推送我的根后,我在 tmp变量

中检索它
Node root = new Node();
root.filingState("input.txt");

之后,我希望我的tmp变量应用所有运算符(向上,向下,向左,向右,哪些都是可能的)并检查最佳结果。

Node tmp = deque.pop();

运营商职能

            if ( !tmp.goalTest(goal) ) {
                if ( tmp.ifDown() ) {
                    if ( !visited[tmp.getX()+1][tmp.getY()] ) {
                        newDown = new Node(tmp);
                        newDown.moveDown();
                    } else newDown = null;
                } // #EndOfDown!
                if ( tmp.ifUp() ) {
                    if ( !visited[tmp.getX()-1][tmp.getY()] ) {
                        newUp = new Node(tmp);
                        newUp.moveUp();
                    } else newUp = null;
                } // #EndOfUp!
                if ( tmp.ifLeft() ) {
                    if ( !visited[tmp.getX()][tmp.getY()-1] ) {
                        newLeft = new Node(tmp);
                        newLeft.moveLeft();
                    } else newLeft = null;
                } // #EndOfMoveLeft!
                if ( tmp.ifRight() ) {
                    if ( !visited[tmp.getX()][tmp.getY()+1] ) {
                        newRight = new Node(tmp);
                        newRight.moveRight();
                    } else newRight = null;
                } // #EndOfMoveRight!
            } else break;

newDown第一次迭代失败,因为我的其他节点没有通过条件来满足条件。

在我的第一个newUp应用其运算符后,它也会更改tmp节点。允许newLeft,newRight将运算符应用于新的tmp节点值。

Node.java

public boolean ifUp ( ) { return y_blank-1 >= 0; }
public boolean ifDown ( ) { return y_blank+1 <= 4; }
public boolean ifLeft ( ) { return x_blank-1 >= 0; }
public boolean ifRight ( ) { return x_blank+1 <= 4; }

/* Movement functions
    Allows a user to move his blank on board
*/
public void moveUp ( ) {
    board[y_blank][x_blank] = board[y_blank-1][x_blank];
    board[y_blank-1][x_blank] = 'B';

    y_blank -= 1;
} // #EndOfMoveUp!

public void moveLeft ( ) {
    board[y_blank][x_blank] = board[y_blank][x_blank-1];
    board[y_blank][x_blank-1] = 'B';

    x_blank -= 1;
} // #EndOfMoveLeft!

public void moveRight ( ) {
    board[y_blank][x_blank] = board[y_blank][x_blank+1];
    board[y_blank][x_blank+1] = 'B';

    x_blank += 1;
} // #EndOfMoveRight!

public void moveDown ( ) {
    board[y_blank][x_blank] = board[y_blank+1][x_blank];
    board[y_blank+1][x_blank] = 'B';

    y_blank += 1;
} // #EndOfMoveDown!

我尝试创建一个复制构造函数,但没有解决问题。

复制构造函数

private char[][] board;

private int x_blank = -1;
private int y_blank = -1;

private Node parent = null;

private Node up = null;
private Node left = null;
private Node right = null;
private Node down = null;

/* Constructor
    Allocates board to a 5x5 2D Array
*/
public Node ( ) { board = new char[5][5]; } 

所以我的问题是,如何创建一个可以保存其他Object的值的Object,但是当我在新创建的对象上应用运算符时,它不会改变原始Object的值

2 个答案:

答案 0 :(得分:1)

您的复制构造函数不会自动用于将该对象的实例赋值给新变量。在Java中,对象分配是通过引用来实现的。您需要在赋值中明确使用复制构造函数:

Node tmp = new Node(deque.pop());

答案 1 :(得分:0)

我认为最好的方法是实现一个克隆函数,它将创建一个具有相同值的新对象,然后你就不会改变原始对象的值。

例如:

clone(Node mynode){
    return new Node(mynode.getValue());
    }