gumatias,
Quando você faz:
Você está instanciando 1 OBJETO Dog, ou seja a variável c1(que está na pilha) irá apontar para o objeto Dog(criado no HEAP). ok?
Com o objeto Dog(c1) criado, também é criado outros dois objeto, um Integer e um Long.
Para o objt Integer, existe um atributo na pilha que aponta para ele.
Para o objt Long, existe um atributo na pilha que aponta para ele.
Quando foi instância outro OBJETO Dog através de:
Quando você faz:
Você está fazendo, instanciando 1 OBJETO Dog(Outro obj), ou seja a variável c2(que está na pilha) irá apontar para o objeto Dog(criado no HEAP, outro objeto criado no HEAP). ok?
Com o objeto Dog(c2) criado, também é criado outros dois objeto, um Integer e um Long. (Outros, que não tem nada haver com aqueles dois criados anteriormente por causa de c1) ok?
Para o objt Integer, existe um atributo na pilha que aponta para ele. (Outro objeto, não é o mesmo criado pelo c1) ok?
Para o objt Long, existe um atributo na pilha que aponta para ele. (Outro objeto, não é o mesmo criado pelo c1) ok?
Com isso você tem 6 objetos
2 Dgo’s
2 Integer’s
2 Long’s
ok?
Reumindo
c1 tem i1 e l1
c2 tem i2 e l2
ok?
Portanto quando você faz c1 = null, nenhuma thread conseguirá mas acessar ao objeto c1, e consequentemente também não poderá acessar aos atributos de c1, ou seja i1 e l1.
Esses dois atributos são dois objetos(um Integer e outro Long), com isso eles também serão removidos pelo GC, quando o GC for executado.
Por outro lado o objeto c2, continua lá tranquilo, vivendo feliz da vida, e consequentemente os seus atributos i2 e l2 também estão felizes da vida, por que podem ser acessados através de c2.
blz?
Não misture os objetos, i1 != i2 e l1 != l2, apesar de serem do mesmo tipo e terem o mesmo valor, não tem a mesma referência.
ok?
Espero ter ajudado. 8)