Dúvida c/ referência de variáveis

5 respostas
Leco2

Olá

estou com uma dúvida com relação a referência de variáveis, por exemplo no código:

protected void param(float[] teste) {
        System.out.println("Dentro da função");
        for (int i = 0; i < teste.length; i++) {
            teste[i] += 1;
            System.out.println(teste[i]);
        }
    }
    
    public static void main(String args[]){
        teste t = new teste();
        
        float[] teste = {0,1,2,3};
        
        System.out.println("Antes da função");
        for(int i = 0; i < teste.length; i++){
            System.out.println(teste[i]);
        }
        
        
        t.param(teste);
        
        System.out.println("Depois da função");
        for(int i = 0; i < teste.length; i++){
            System.out.println(teste[i]);
        }
    }

Esse é o resultado desse código:

Antes da função
0.0
1.0
2.0
3.0
Dentro da função
1.0
2.0
3.0
4.0
Depois da função
1.0
2.0
3.0
4.0

Minha é dúvida é porque o vetor teste iniciado no main, depois que passa pela função param ele muda de valor.
Porque a varável teste muda de valor também fora da função?
Pode ser uma pergunta boba mais estou realmente com dúvida nisso

5 Respostas

rafadelnero

Isso acontece pelo fato de um array em Java ser um objeto!

No método você passou uma referência ligada a um objeto array localizado no heap da memória.

Você deve estar se confundindo porque provavelmente você sabe que o Java passa seus valores nos parâmetros de um método por valor, ou seja passa somente uma cópia do valor, não a variável original, mas com objetos é diferente, pois é passado uma cópia da referência(controle) que acessa diretamente o objeto criado na memória, se você mudar o valor do objeto através da referência com certeza terão o mesmo valor, isso porque a referência das suas variáveis apontam para o mesmo objeto, como ocorre no seu exemplo:

Dentro da função  
1.0  
2.0  
3.0  
4.0  
Depois da função  
1.0  
2.0  
3.0  
4.0
Leco2

Entendi!! Faz sentido
Agora como faço pra passar um objeto sem alterar o valor dele original?

regis_hideki

Leco:
Entendi!! Faz sentido
Agora como faço pra passar um objeto sem alterar o valor dele original?

Você pode passar um clone.

Tenta chamar a função assim:

t.param(teste.clone());

Nesse caso, você está passando uma referência de um objeto que possui as mesmas características do objeto teste (mas que aponta para outra parte da memória). Dessa forma, apenas o clone é modificado.

Leco2

Perfeito!

Valeu pessoal!

Nunca tinha me deparado com esse tipo de problema.

ttelsen

acho que esse link aqui vai ajudar

Criado 30 de janeiro de 2014
Ultima resposta 31 de jan. de 2014
Respostas 5
Participantes 4