我很好奇Java如何处理如下情况,我将提供一些有关我正在做什么的见解。
我正忙着为ProjectEuler问题写一个Sudoku Solver,我正在使用2D节点数组(自定义对象):
Node[][] grid;
以下是我的节点类:
public class Node {
public int x;
public int y;
public int value;
public int quadrant;
public ArrayList<Integer> possibleNumbers;
public SudokuNode() {}
public SudokuNode(int x, int y, int value, int quadrant) {
this.x = x;
this.y = y;
this.value = value;
this.quadrant = quadrant;
this.possibleNumbers = new ArrayList<Integer>();
}
public ArrayList<Integer> getArray() {
return possibleNumbers;
}
}
现在在解决难题的过程中的某个阶段我可能会发现我需要猜测一下,我想要做的是将网格的当前状态备份到另一个名为Guess的对象中,该结构如下以及:
public class Guess {
public Node[][] grid;
public int x;
public int y;
public Guess(Node[][] puzzle, int x, int y) {
this.grid = puzzle;
this.x = x;
this.y = y;
}
}
在这个对象中,我希望制作一个当前网格的副本,以及我猜测的节点的X和Y坐标。
我感到好奇的是,Java是否会制作网格的完整副本,或者只是使用指向原始网格的指针?
我的一个朋友正在用Javascript编写一个Solver,我知道他们是完全不同的语言,他遇到了一个问题,网格没有被备份,因为它仍然引用他创建的原始网格如果猜测结果是错误的,那么就无法恢复到之前的状态。
我想了解当我说这样做时会发生什么:
Node[][] backup = currentGrid;
是否制作了全新的副本?
很抱歉,如果这是一个重复或愚蠢的问题。我正在自学编程,因此我可能错过了一些东西,或者只是不了解一些核心概念。
答案 0 :(得分:1)
当您将对象引用传递给构造函数或其他方法时,新引用始终指向原始引用指向的同一对象。
Cat a = new Cat("Harry");
Cat b = a;
b.setName("Not Harry");
System.out.println(a.getName())
输出:“不是哈利”。
您可以序列化对象或将状态变量写入文件以备份对象的状态。
答案 1 :(得分:1)
在Java中,任何类型的操作
Object a = b
将导致a
引用b
在该时间点引用的同一对象。
如果修改了对象(通过a
或b
或任何其他参考),则无论使用何种参考来进行更改,都会反映出更改。