java方法正确返回,但也更改了初始参数

java方法正确返回,但也更改了初始参数,java,methods,Java,Methods,这是为了十五个游戏,我制作了一个类(Config),它由一个int数组组成,用来表示棋盘的状态。 然后我制作了一些move方法,这些方法接收配置A,创建它的一个副本,找到它的0并应用该方法应该进行的任何移动,然后将其作为配置B返回。 这是按计划发生的,但问题是,当我尝试打印配置A之后,它也发生了变化,无论我做什么动作,它都与B相同。 示例:dada.tabela是数组 如果我在move_left_new之前打印randomconfig,它将按原样打印原始配置,但是如果我在之后打印,它将打印与te

这是为了十五个游戏,我制作了一个类(Config),它由一个int数组组成,用来表示棋盘的状态。 然后我制作了一些move方法,这些方法接收配置A,创建它的一个副本,找到它的0并应用该方法应该进行的任何移动,然后将其作为配置B返回。 这是按计划发生的,但问题是,当我尝试打印配置A之后,它也发生了变化,无论我做什么动作,它都与B相同。 示例:dada.tabela是数组

如果我在move_left_new之前打印randomconfig,它将按原样打印原始配置,但是如果我在之后打印,它将打印与testingmove相同的内容

import java.util.*;
class Config{
int[] tabela;


Config(){
int[] blanks ={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
tabela = blanks;
}
public Config(int arraydado[]){
tabela = arraydado;}
 public void printTabela(){
for(int i = 0; i<16 ;i++)
    System.out.print(tabela[i] + " ");
System.out.println();
}
}
    public static Config move_left_new(Config dada){
    int i;
    int temp;
    Config resultante = new Config(dada.tabela);
    for(i = 0; i<16; i++){
    if(resultante.tabela[i] == 0)
        break;
    }
    if( i!=0 && i!= 4 && i!= 8 && i!=12){
    temp = resultante.tabela[i-1];
    resultante.tabela[i-1] = 0;
    resultante.tabela[i] = temp;
    }
    return resultante;
}

public static void main(String[] args){
Scanner input = new Scanner(System.in);
int arr[] = new int[16];
for(int i=0; i<16; i++)
arr[i] = input.nextInt();

Config randomconfig = new Config(arr);
randomconfig.printTabela(); //original
Config changed = move_left_new(randomconfig);
randomconfig.printTabela(); //should be the same as before but isnt
changed.printTabela(); // moved as it should
}
import java.util.*;
类配置{
int[]tabela;
Config(){
int[]空格={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
tabela=空白;
}
公共配置(int arraydado[]){
tabela=arraydado;}
public void printTabela(){

对于(int i=0;i数组是java中的引用。因此,在执行
Config resultant=new Config(dada.tabela);
之后,
resultance
dada
tabela
都将引用/指向同一数组

您可能想要做的是创建
dada.tabela
的浅层副本,然后将该浅层副本传递给Config的构造函数以实例化
resultant

尝试:


将所有代码直接作为文本发布在此处。为什么要将文本作为图像发布?还有很多内容与此无关,但我会将主要部分粘贴在此处作为文本。请在创建副本时添加代码ConfigA@Rodrigo我真的很喜欢非英语的SENG代码。它让我想起了挪威的公共部门。顺便说一下-1是not me:)@Rodrigo这就是为什么你发布的代码应该是你问题的一部分。
Config resultante = new Config(dada.tabela.clone());
Config resultante = new Config(Arrays.copyOf(dada.tabela, dada.tabela.length));