把一个类的字段变量作为参数传递给另一个类对象的创建?

3

我有一个关于将实例变量作为参数传递给正在创建的新对象的问题。在第二个类中,它似乎修改了第一个类的字段成员,这不是我想要的结果。我将发布一些代码以说明我的意思 -

    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[],它会直接修改。

2个回答

1
我认为你的理解接近,但你误解了一个概念。当你写下以下内容时:
posArray = new int[16];
posArray = positions;

你首先创建了一个新对象 (int[]),但指向该对象的指针被设置为 指向现有对象。在Java中,数组是堆上的对象,您可以有多个引用指向同一对象。通过任何引用对数组所做的任何更改都会反映到所有引用中。在简单情况下解决这个问题,需要在传递之前 clone 数组。
Mover theMover = new Mover(whichToMove, positions.clone());

1
通常最好避免使用clone()(在《Effective Java》中建议如此)。对于原始类型,可以使用一对new int[src.length]; System.arraycopy(...);。对于引用类型,您需要显式地使用“复制构造函数”。 - Victor Sorokin
@VictorSorokin 很有趣,我不知道克隆不可取。谢谢你分享。 - Kon
谢谢大家!感谢反馈! - Matt Southard

1

改为:

posArray = new int[16];
posArray = positions;

do this:

posArray = Arrays.copyOf(positions, 16);

这将有效地将您的positions数组的内容复制到posArray中。

1
谢谢!感谢您的反馈! - Matt Southard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接