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

标签 java

我有一个关于将实例变量作为参数传递给正在创建的新对象的问题。在第二个类中,好像是在修改第一个类的字段成员,没想到是这样的。我将发布一些代码来说明我的意思 -

    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/

相关文章:

java - 如何用Java程序上传数据(文本、图片)到Parse.com?

java - 在 UI 线程之外修改 FXCollections.synchronizedObservableList

java - 如何在 Struts 1 中使用 Tiles2

java - 如何使用 RowFilter 筛选出 JTable 的行

java - Nativescript 应用程序版本 : Issue facing while gradle build

java - 如何使用 java swing 文本框输入日期并将其存储在 mysql 数据库中?

java - while block 中的初始化?

java - GWT:更改树行的填充?

java - 使用 Java 仅获取工作日

java - cassandra UTF8 或 LongType 中的 key 验证类类型?