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.