我有一个关于将实例变量作为参数传递给正在创建的新对象的问题。在第二个类中,它似乎是修改第一个类的字段成员,我不认为是这种情况。我会发布一些显示我的意思的代码 -
private void movethePiece(int whichToMove) {
// TODO Auto-generated method stub
Mover theMover = new Mover(whichToMove, positions); // positions is an array
//and is an instance variable in the current class.
现在这里是类移动器中的构造函数 -
public class Mover {
private int toMove;
private int[] posArray;
private Boolean toSwap;
public Mover(int tilePiece, int[] positions) {
toMove = tilePiece;
posArray = new int[16];
posArray = positions; //assigning positions to a new variable
toSwap = false
}
代码正在修改第一个类中的位置。如果我不希望它这样做,我是否必须在第一个类中使用位置的数组值创建一个新对象并将其传递给它?我想,因为我在移动器类中创建了一个新的int [],它会直接修改它。
答案 0 :(得分:1)
我认为你的理解很接近,但你误解了一个概念。当你写:
posArray = new int[16];
posArray = positions;
您首先创建一个新对象(int[]
),但指向此对象的指针则设置为指向现有对象。在Java中,数组是堆上的对象,您可以有多个引用指向同一个对象。通过任何引用对数组的任何更改都反映了所有引用。要在简单的情况下解决这个问题,您需要在传递数组之前clone
。
Mover theMover = new Mover(whichToMove, positions.clone());
答案 1 :(得分:1)
而不是:
posArray = new int[16];
posArray = positions;
这样做:
posArray = Arrays.copyOf(positions, 16);
这会有效地将positions
数组的内容复制到posArray
。