我写了一个函数来更改输入矩阵并以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 |
-------------
请帮助!谢谢大家
答案 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