为什么我的up函数将输入更改为其Java代码块之外的内容

时间:2018-12-23 13:52:57

标签: java

我写了一个函数来更改输入矩阵并以Java返回更改后的矩阵。 但是当我想在调用此函数后使用输入矩阵时,我看到我的输入矩阵已更改。 我的功能:

char[][] up(char[][] state, int[] empty){

    int ie = empty[0];
    int je = empty[1];

    if(tools.checkMoves(state,1,ie,je)){
        state[ie][je] = state[ie-1][je];
        state[ie-1][je] = '0';
    }else{
        System.out.println("Move not allowed");
    }

    return state;
}

打印矩阵然后调用函数,然后再次打印矩阵

System.out.println(gameGenerator.printGame(nextState));
    System.out.println(gameGenerator.printGame(moves.up(nextState,tools.getEmpty(nextState))));
    System.out.println(gameGenerator.printGame(nextState));

答案是: 1.打印输入矩阵

-------------
| 1 | 2 | 3 |
| 5 | 7 | 6 |
| 4 |   | 8 |
-------------

2。函数返回的打印矩阵

-------------
| 1 | 2 | 3 |
| 5 |   | 6 |
| 4 | 7 | 8 |
-------------

调用函数后的3.print输入矩阵已更改!

-------------
| 1 | 2 | 3 |
| 5 |   | 6 |
| 4 | 7 | 8 |
-------------

请帮助!谢谢大家

1 个答案:

答案 0 :(得分:0)

您正在这两行中修改输入矩阵:

state[ie][je] = state[ie-1][je];
state[ie-1][je] = '0';

Java是一种面向对象的语言。将对象传递给方法时,将传递其引用。引用被复制,但对象本身不被复制。当您在方法内部修改对象时,它仍然在方法之后进行修改(这是正常的,因为它是同一对象)。

如果您不希望方法产生任何副作用,请在方法的开头创建矩阵的副本,然后修改副本。


附加说明:

您可能想知道为什么当输入是基本类型时,方法外的值仍然相同,如下所示:

public void modify(int i){
  i = 5;
} 

这是因为Java是按值传递 ,这意味着调用该方法时将复制 i 的值,因此仅修改该副本。正如我上面所写,对象引用也按值传递,这意味着该引用已被复制。 (粗略地解释一下,您将指针的值复制到对象中。)

如果您需要更详细的说明,可以阅读以下内容:http://www.javadude.com/articles/passbyvalue.htm