Erro na troca de referência em array [RESOLVIDO]

3 respostas
daniellgp

Alguém poderia me explicar porque o código abaixo não imprime “2”? Ao invés disso imprime “1”??

Main.java:

public class Main { public static void main(String[] args){ Java1 j = new Java1(); j.run(); } }
Java1.java: public class Java1 { int j[] = {2}; public void run(){ int i[] = {1}; change_i(i); System.out.println(i[0]); } public void change_i(int[] i){ i = this.j; } }

Um gabarito de uma questão de java informava a resposta “1”. Eu fiquei um pouco desconfiado, afinal se todo array é um objeto (não importando se ele é de tipos primitivos ou não), logo o que foi passado como parâmetro na função change_i foi a referência do array (objeto) a qual seria apontada para um outro objeto, o j[], na linha 11. Fui pro eclipse e pra minha surpresa o gabarito estava certo. Engraçado que no debug, quando a referência de j é atribuída a variável i o identificador do objeto realmente troca, mas quando ele volta pro corpo da função main() o identificador volta pro inicial do nada!!??

Agradeço quem puder esclarecer.

Att,
Daniel Lima

3 Respostas

A

Cara, na função “change_i” vc não está fazendo absolutamente nada !
Vamos trocar o nome da variável pra ficar mais claro
Olha o código abaixo:

public class Java1 {   
    int j[] = {2};   
    public void run(){   
        int i[] = {1};   
        change_i(i);   
        System.out.println(i[0]);   
    }     
    public void change_i(int[] nomeDiff){   
        nomeDiff = this.j;   
    }   
}

no momento que eu chamar o change_i, estarei passando a REFERENCIA do meu array para a variável “nomeDiff”. Nesse momento eu tenho DUAS variáveis referenciando o mesmo array na memória. Essas variáveis são “nomeDiff” e “i”.
No momento em que eu faço

nomeDiff = this.j;

eu simplesmente faço com que a variável “nomeDiff” referencie outro array, o array que está sendo referenciado por “j”. Entretanto, a referencia da variável “i” não foi alterada.
Entedeu ?
[]'s !

ViniGodoy

O java só admite passagem de parâmetros por cópia, não por valor. Quando você chamou a função change_i você fez a cópia da referência, que aponta para a matriz i. No interior dessa função, você alterou a cópia da referência para que ela apontasse para outro lugar. Fora da função, a referência original permaneceu inalterada.

O que confunde é que tanto a cópia da referência, quanto a referência, apontam para o mesmo objeto. Portanto, no interior da função change_i seria possível fazer:

i[0] = 2; //Ok, estamos alterando um valor do objeto para onde a referência aponta

Mas não surte efeito fazer:

i = j; i = null; i = new int[] {1,2,3};

Pois isso só afeta o valor da referência em si.

daniellgp

Valeu pessoal!

Eu só estava pensando na heap e esqueci da stack - realmente são variáveis diferentes. Obrigado!

Att,
Daniel Lima.

Criado 17 de novembro de 2009
Ultima resposta 17 de nov. de 2009
Respostas 3
Participantes 3