Valor da variável que muda ao sair de um método estático?

2 respostas
java
Dklein

Amigos, estava fazendo um exercício que não consigo entender algo que acontece nele. Sequer sei explicar muito do que se trata… mas basicamente eu não entendo a saída dele (19 e depois 20). Para mim as duas saídas deveriam ser 19 e não entendo por que no System.out.println o valor da variável é acrescido em 1.

Alguém saberia me explicar? Segue o código:

class Wrapper{
    int w = 10;
}

public class TestClass{

static Wrapper changeWrapper(Wrapper w){
    w = new Wrapper();
    w.w += 9;
    System.out.println(w.w);
    return w;
}
    

public static void main(String[] args){
    Wrapper w = new Wrapper();
    w.w = 20;
    changeWrapper(w);
    System.out.println(w.w);

2 Respostas

aix

Ola Dklein,

Inicio da execução, um obeto Wrapper é criado.

Wrapper w = new Wrapper();

Através da referência o valor 20 é atribuido a variável w.

w.w = 20;

O método changeWrapper é executado e passado a ele o parâmetro (objeto Wrapper com o valor 20 em w)
porém na primeira linha de execução deste método ocorre uma nova instância de Wrapper w = new Wrapper(); perceba que aquele sinal de igual significa (recebe o valor de) a referência w recebe um novo Wrapper e o valor 20 foi para o limbo deixando o novo objeto com w = 10 novamente. O valor 19 é atribuido e impresso na saida padrão.

changeWrapper(w);

Aqui o system.out é executado e impresso 20 que é o valor da referência recebida no método main

System.out.println(w.w);

Porque não imprimiu 19 e depois 19?
porque java passa por valor, se dentro do método main você fizesse a referência w de main receber o retorno do método changeWrapper então seria 19 19.

ex:

public static void main(String[] args){
    Wrapper w = new Wrapper();
    w.w = 20;
    w = changeWrapper(w);
    System.out.println(w.w);
Dklein

aix, bom dia e obrigado pela resposta. Estava escrevendo a resposta dizendo que não tinha entendido ainda, mas olhando umas 500 vezes o que você escreveu o código e o que você disse acho que finalmente saquei: não tinha me tocado dessa diferença entre o retorno do método e que o w aponta para um outro objeto dentro e fora do main. Era até uma questão mais simples do que eu imaginava, obrigado mesmo pela ajuda!

Criado 1 de abril de 2016
Ultima resposta 1 de abr. de 2016
Respostas 2
Participantes 2