2014-11-22 57 views
0

我调用函数移动与2维阵列全零的点[6,5]其具有值0 。该功能将值增加到。局部变量的更新全局在Java

然后同样的功能调用自身再次举动(X - 1,Y,地图,ⅰ),这就意味着它是在点[5,5]与值,它增加了到并结束本身。

但是为什么变量也被更新的函数,它被称为第一?

private static byte[10][10] myMap = {*all zeros*}; 

public static void main(String[] args) { 
    move(6, 5, myMap, 0); 
} 

private static void move(int x, int y, byte[][] map, int i) { 
    if (map[x][y] == 0) { 
     map[x][y]++; 
     i++; 
    } 
    if (i > 1) return; 

    System.out.print(x + " " + y); 
    // 6 5 
    System.out.print(map[5][5] + " " + i); 
    // 0 1 
    move(x - 1, y, map, i); 

    System.out.print(map[5][5] + " " + i); 
    // 1 1 ... WTH? Shouldn't this return 0 1 like above? 
} 

而当它更新地图,为什么它不更新变量?

我挣扎小时找到原因,但仍然不知道:/ 感谢您的帮助

+0

什么'私人静态的byte [] [] = MYMAP新的字节[10] [10]'?请注意,在Java中,数组总是会被初始化为“false”,“0”或“null”。 – 2014-11-22 13:43:38

+0

我已经更新了使用地图的答案中的一些示例,但最终您可能希望创建一个使用'byte [] []'作为字段(或称为'GameMap',但不是'Map',因为这是来自'java.util'的重用类)。 – 2014-11-22 14:18:20

+0

@owlstead谢谢,我只需要cloneMap函数..因为我没有做任何游戏,我不需要存储地图,我唯一关心的是**我**和时间多久需要考虑我正在建设的机器人旅行..我删除了所有的方法和东西,只是为了显示我的问题;) – user2781994 2014-11-22 16:51:10

回答

3

这可以一见钟情是混乱的,但它是很容易当你明白通过引用传递理解并通过价值传递。数组变量由对实际数组的引用组成。基本上他们被视为对象相同。这意味着你正在更新你给该函数的地图。

int变量是基本类型(intshortbytelongcharfloatdouble,当然boolean - 记下名字的首字母小写字符),这是由值在Java中通过。基本上是价值的副本。所以你永远不能使用这样的变量来返回任何值。如果你想这样做,你需要一个return声明。


例如:

// using depth first, then width!!! 
private static byte[][] myMap = new byte[10][10]; 

public static void main(String[] args) { 
    move(6, 5, myMap, 0); 
} 

private static byte[][] cloneMap(byte[][] map) { 
    byte[][] newMap = new byte[map.length][]; 
    for (int x = 0; x < map.length; x++) { 
     newMap[x] = map[x].clone(); 
    } 
    return newMap; 
} 

private static void printMap(byte[][] map) { 
    for (int x = 0; x < map.length; x++) { 
     for (int y = 0; y < map[0].length; y++) { 
      System.out.printf("%3d ", map[x][y] & 0xFF); 
     } 
     System.out.printf("%n"); 
    } 
} 

private static int move(int x, int y, byte[][] map, int i) { 
    if (map[x][y] == 0) { 
     map[x][y]++; 
     i++; 
    } 
    if (i > 1) return i; 

    System.out.printf("x: %d, y: %d%n", x, y); 
    // 6 5 

    printMap(map); 
    System.out.printf("i: %d%n", i); 

    // -- note, you may still be missing some way of storing the maps 
    map = cloneMap(map); 
    i = move(x - 1, y, map, i); 

    // System.out.println(map[5][5] + " " + i); 
    printMap(map); 
    System.out.printf("i: %d%n", i); 
    return i; 
} 
+0

好的,谢谢!但如何通过价值传递数组? – user2781994 2014-11-22 13:23:19

+3

@Dev no。一切都是按价值传递的。 – MeBigFatGuy 2014-11-22 13:34:31

+0

@owlstead我的坏,我翻了它(公平你做了以及编辑之前,让我绊倒)。我的观点是,基元和对象的处理方式与按值传递相同,只是基元本质上是不变的。无论哪种方式+1的解释。 – Dev 2014-11-22 13:35:51