我有一个关于将实例变量作为参数传递给正在创建的新对象的问题。在第二个类中,好像是在修改第一个类的字段成员,没想到是这样的。我将发布一些代码来说明我的意思 -
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
}
代码正在修改第一类中的位置。如果我不希望它这样做,我是否必须在第一个类中使用位置数组值创建一个新对象并将其传递给它?我想,因为我在 mover 类中创建了一个新的 int[],所以它可以直接修改它。
最佳答案
我觉得你的理解很接近,但是你误解了一个概念。当你写:
posArray = new int[16];
posArray = positions;
您首先创建了一个新对象 (int[]
),但是指向该对象的指针随后被设置为指向一个现有对象。在 Java 中,数组是堆上的对象,可以有多个引用指向同一个对象。通过任何引用对数组的任何更改都会反射(reflect)所有引用。要在简单情况下解决此问题,您需要在传入数组之前克隆
您的数组。
Mover theMover = new Mover(whichToMove, positions.clone());
关于java - 将一个类的字段变量作为参数传递给另一个类对象的创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28219875/