为什么我的up函数会在Java中改变输入

为什么我的up函数会在Java中改变输入,java,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];

我编写了一个函数来更改输入矩阵,并用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.调用函数后打印输入矩阵,并更改

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

请帮忙!感谢大家

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

state[ie][je] = state[ie-1][je];
state[ie-1][je] = '0';
Java是一种面向对象的语言。将对象传递给方法时,传递其引用。将复制引用,但不会复制对象本身。当您在方法内部修改对象时,它仍然在方法之后修改,这是正常的,因为它是相同的对象

如果不希望方法产生任何副作用,则必须在方法开头创建矩阵的副本并修改副本

补充说明:

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

public void modify(int i){
  i = 5;
} 
这是因为Java是按值传递的,这意味着在调用方法时复制i的值,因此只修改副本。如上所述,对象引用也通过值传递,这意味着引用被复制。为了粗略地解释它,您将指针的值复制到对象


如果您想要更详细的解释,您可以阅读以下内容:

是的,我在发布此问题后做了此操作。所以这是正确的方法。多谢了,但有一件事,当使用整数返回类型的函数时,这种情况不会发生。例如,函数给出一个数字,然后将其乘以-1并返回。我编辑了我的答案,解释了原语的区别