【问题标题】:Editing fields of an object 2d array in java在java中编辑对象二维数组的字段
【发布时间】:2015-09-12 10:00:27
【问题描述】:

目标是将一些 Tile 对象和自定义属性复制到 2D 数组中,但是我得到了意想不到的结果:

    for (int i = 0; i<3; i++)
    {
        for (int j = 0; j<3; j++)
        {
            TileList[i][j] = Tiles[3];
            //the goal is the overwrite the MapX and MapY fields of each element of the new Array 
            TileList[i][j].MapX = i;
            TileList[i][j].MapY = j; 
        }
    }

在打印出每个元素的值后,每个元素的每个 MapX 和 MapY 字段都应该有自己单独的值,但是对于 2d 数组中的每个图块对象引用,MapX 和 MapY 都设置为 3。

【问题讨论】:

    标签: java arrays field


    【解决方案1】:

    您正在使用以下语句将所有数组成员设置为同一个对象:

        TileList[i][j] = Tiles[3];
    

    该语句复制对对象的引用,而不是对象本身。

    在最后一次循环中,所有数组成员都指向同一个对象,这些语句将其成员设置为 3 和 3:

        TileList[i][j].MapX = i;
        TileList[i][j].MapY = j; 
    

    如果您希望所有数组成员指向不同的对象,您可以使用默认构造函数为每个对象创建一个新对象:

        TileList[i][j] = new Tile();
    

    或复制另一个对象的构造函数:

        TileList[i][j] = new Tile( myDefaultTile );
    

    或者clone()方法,如果你支持的话:

        TileList[i][j] = myDefaultTile.clone();
    

    顺便说一句,请注意,在 Java 中,变量和类成员的名称通常以小写字母开头。例如:

        tileList[i][j].mapX = i;
    

    【讨论】:

    • 您的解决方案奏效了,这就带来了另一个问题,为什么需要使用 Tile [][] TileList = new Tile[][];在循环之前实例化,起初它没有工作并得到一个空指针异常,直到我使用上述语句
    • 您必须先创建数组,然后才能将内容放入其中。创建矩形二维数组的最简单方法是预先指定两个维度——例如,Tile[][] tileList = new Tile[3][3]。这将创建一个包含空引用的数组,您可以使用 new Tile() 填充它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    相关资源
    最近更新 更多