Cuidado - não confunda “objetos” com “variáveis”.
No código que você mostrou, “t” é o nome de uma variável.
É por isso que não existe “o nome de um objeto”.
Muita gente pergunta “como é que posso achar o nome de um objeto”?
A resposta é: a pergunta não faz sentido. Quem tem nome é uma variável, não o objeto.
Para identificar os objetos, vou dar um número para eles, para você não se confundir.
Isso vai lhe ajudar bastante com aqueles exercícios de certificação.
class Test{
public static void main (){
Test t = new Test(); // cria um objeto @1 . A variável t recebe uma referência para @1.
t = null; // O objeto @1 não é mais referido por t. Se não houver nenhuma outra referência, @1 pode ser recolhido pelo GC.
new Test(); // cria um objeto @2. A partir daqui, se não houver nenhuma outra referência, @2 pode ser recolhido pelo GC.
}
}
Por que é que eu disse “se não houver nenhuma outra referência”?
É que outras partes do código, que você não está vendo, podem receber referências para o tal objeto.
Vou mudar o seu exemplo um pouquinho, só para você ver.
class Test{
private static List<Test> objetosCriados = new ArrayList<Test>();
public Test() {
objetosCriados.add (this);
}
public static void main (){
Test t = new Test(); // cria um objeto @1 . A variável t recebe uma referência para @1, mas Test.objetosCriados também adquire uma referência para @1
t = null; // O objeto @1 não é mais referido por t. Se não houvesse nenhuma outra referência, @1 poderia ser recolhido pelo GC.
// Só que o problema é que Test.objetosCriados ainda tem uma referência para @1, portanto @1 não pode ser limpado pelo GC.
new Test(); // cria um objeto @2. A partir daqui, se não houvesse nenhuma outra referência, @2 poderia ser recolhido pelo GC.
// Só que o problema é que Test.objetosCriados tem uma referência para @2, portanto @1 não pode ser limpado pelo GC.
}
}
Viu? É por isso que o problema de saber se um objeto foi coletado ou não, não é muito trivial porque exige você olhar o código inteiro, não só um pedacinho.