Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida no Ex. 2 do Capítulo 2 - Diferencia entre variáveis de referências a objetos e tipos primitivos

class B { int v = 15; } class A { public static void main(String[] args) { B x = new B(); B y = x; y.v++; x.v++; B z = y; z.v--; System.out.println(x.v + y.v + z.v); } }

quando faço z.v--; ele não decrementa menos 1 e fica valendo 15? não consegui entender bem essa parte ou ele não decrementa por ser objeto referenciado de B?

1 resposta
solução!

Oi Paulo,

Veja o seu código um pouco alterado, por questões didáticas:

package com.mkyong.config;

import com.mkyong.config.B;

class B {
    int v = 15;
}

class A {
    public static void main(String[] args) {
        B x = new B();   // Cria o objeto x
        B y = x;                // Cria uma nova referência ao objeto x, não uma cópia

        y.v++;     // Incrementa 1 à variável v (passa a valer 16)
        x.v++;    // Incrementa 1 à variável v (passa a valer 17)
               // Perceba que "x" e "y"são referências do mesmo objeto

        B z = y;  // Cria uma nova referência ao objeto "x"
        z.v--;      // decrementa 1 à variável v (passa a valer 16)

        System.out.println(x.v);
        System.out.println(y.v);
        System.out.println(z.v);
        System.out.println(x.v + y.v + z.v);
    }
}
Resultado da impressão:
16
16
16
48

Os objetos ocupam um determinado local na memória do computador e a variável "x" têm juntamente este endereço de memória, então, quando você criou a variável "y" e fez "y = x", na verdade, você fez "y" também apontar para a mesma posição em que "x"estava apontando, portando, as duas variáveis passaram a apontar para o mesmo objeto.

No caso de você criar uma variável de um tipo primitivo é um pouco diferente, veja o fragmento de código a seguir:

{
   int a = 13;
   int b = a;
   a++;
   System.out.println(a);
   System.out.println(b);
}

As variáveis "a"e "b" ocupam endereços de memória diferentes e quando é feito "int b = a;" a variável "b"é criada e o conteúdo da variável "a" é COPIADO para a variável "b", ou seja, embora, a partir desta declaração, "b"passe a ter o mesmo valor da variável "a", as duas variáveis estão em posições de memória completamente diferentes, então, quando é executada a instrução "a++;" nada acontece com a variável "b", como você pode ver no resultado.

Perceba que variáveis de objetos têm o valor de posição de memória onde o objeto está e as variáveis primitivas têm um valor do tipo definido pelo programador.

Espero ter ajudado.