【问题标题】:Method modifies method out of scope方法修改方法超出范围
【发布时间】:2012-12-19 06:13:25
【问题描述】:

我今天有一个非常有趣的问题。我正在尝试修改一个数组,但方法修改了另一个甚至没有调用的数组。

a)造成麻烦的部分方法

public static void place2(String output, int position,furniture furniture_array[], char room_grid[][]) {

    int i=0;
    int j=0;

    furniture_array[position].setXY(i, j);
    char grid1[][] = room_grid;
    char grid2[][] = room_grid;
    char grid3[][] = room_grid;
    char grid4[][] = room_grid;
    pasteToArray(i, j, grid1, furniture_array[position]);
}

b)pasteToArray

这是一个非常简单的方法,它接收 input_array 并且在这个数组中它会通过作为对象值的数组。

public static char[][] pasteToArray(
    int x, int y, char input_array[][], furniture furniture_to_be_placed) {

    char[][] result=input_array;

    for (int i = 0; i <= furniture_to_be_placed.getSize(); i++) {
        for (int j = 0; j <= furniture_to_be_placed.getSize(); j++) {
            result[x + i][y + j] = furniture_to_be_placed.furn_grid[i][j];
        }
    }
    return result;
}

我的问题是什么?

  1. 为什么输入 A、B 和结果 C 的方法会修改 D? (相对名称)

我自己已经做了什么来解决它:-

  1. 调试代码 - 找到导致问题的方法
  2. 25 分钟的无助哭泣包括咒骂
  3. 检查全局变量
  4. 将所有方法输入重命名为相对中性名称

谁能帮我解决这个问题?

【问题讨论】:

  • 在给Java方法名时不要使用下划线('_')。这不是惯例。

标签: java arrays theory


【解决方案1】:

grid1、grid2、grid3 和 grid4 都是对同一个二维数组的引用。改变一个值将改变所有值。

这段代码...

char grid1[][] = room_grid;
char grid2[][] = room_grid;
char grid3[][] = room_grid;
char grid4[][] = room_grid;

不会创建 4 个 room_grid 副本,而是创建 4 个对同一内存块的不同引用。

【讨论】:

  • 宁可:“为同一个对象创建 4 个不同名称的引用”——Java 并不真正有“内存块”的概念,尽管最终效果是一样的。
  • 那么好的分辨率会这样吗? int[] b = (int[])a.clone();
  • 这适用于一维基元数组,但二维数组实际上只是数组数组(即对象数组),这意味着int[][] b = (int[][])a.clone(); 只会生成构成a 的各个参考。同样,如果您使用任何其他 Object 类型的一维数组,您仍然会为每个对象创建多个引用,而不是克隆对象本身。
  • @fge - 你能详细说明一下吗?您是否只是指出二维数组只是数组对象的数组,因此不一定形成一个连续的块?还是更多?
  • @Mike an array with element of type T最终是对T[]类型对象的引用,而T也可以是一个数组,而T的数组元素也可能是数组等。这就是为什么“引用”在这里很重要:引用可以访问数组,它不包含其元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多