java方法正确返回但也改变了初始参数[重复]

问题描述 投票:-3回答:1

这个问题在这里已有答案:

这是十五场比赛,我做了一个班级(Config),它由一系列整数组成,代表董事会的状态。然后我做了一些移动方法,接收Config A,创建它的副本,找到它0并应用该方法应该进行的任何移动,然后将其作为Config B返回。这是按计划发生但问题是当我尝试print config A之后它也发生了变化,无论我做什么动作都和B一样。示例:https://imgur.com/qnZX12Y 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
}
java methods
1个回答
-1
投票

数组是java中的引用。所以在你做Config resultante = new Config(dada.tabela);之后,tabelaresultancedada都会引用/指向相同的数组。

你可能想要做的是创建一个dada.tabela的浅拷贝,然后将那个浅拷贝传递给Config的构造函数来实例化resultante

尝试:

Config resultante = new Config(dada.tabela.clone());

要么

Config resultante = new Config(Arrays.copyOf(dada.tabela, dada.tabela.length));
© www.soinside.com 2019 - 2024. All rights reserved.