Tenho o código abaixo e gostaria de confirmar quantos objetos estarão aptos para o coletor de lixo.
class Test{
Float x=5.2f;
Test(){}
Test(float f){
x=f;
}
Test getObject(Test t){
t=null;
return t;
}
public static void main(Stringargs[]){
Test t=new T();
Test t1=t;
Test t2=t.getObject();
t=null;
}
}
Acredito que tenho dois objetos para serem coletados. O objeto t e o Float x. (Correto).
Goastaria de confirmar o seguinte, se eu não atribuisse um valor para Float x, ele receberia null, Então eu teria apenas um onjeto para ser coletado? Certo?
E se o Float x fosse float x? Eu também teria apenas um objeto a ser coletado, pois float x não é objeto então não fica no heap.
Certo?
Tem dois erros ai kra.
Com certeza esse foi erro de datilografia, vc ta chamando um construtor de uma classe q n existe, seria no caso então:
Test t = new Test();
Mas td bem, deu pra intender =PP
O danado é q nessa linha:
Vc ta chamando o método getObject() e n tá passando parâmetro nenhum. Ele precisa de um parâmetro do tipo Test. Acredito q seja mais um erro de datilografia, e como só houve um único objeto instanciado nesse código, creio eu q vc queria passar ele.
Se for isso acredito q não há objetos a serem coletados.
As variáveis t e t2 estão null, porém a variável t1 ainda aponta para o objeto criado, logo ele n está propenso a coleta. Acredito q seja isso.
Retificação do código.
class Test{
Float x=5.2f;
Test(){}
Test(float f){
x=f;
}
Test getObject(Test t){
t=null;
return t;
}
public static void main(Stringargs[]){
Test t=new Teste();
Test t1=t;
Test t2=t.getObject(t);
t=null;
}
}
Posso estar errado (se tiver, alguém me corrija), mas acho que não há nenhum objeto apto para coleta.
Você tem 2 objetos instanciados:
Test t = new Teste();
Float x = 5.2f;
Depois t1 referencia o mesmo objeto que t:
Test t1=t;
Depois t2 não referencia nada (null):
Test t2=t.getObject(t);
E depois vc anula a referencia de t:
t = null;
Mas t1 ainda continua referenciando o objeto criado…
[quote=Marcos Paiva]Acredito que tenho dois objetos para serem coletados. O objeto t e o Float x. (Correto).
Goastaria de confirmar o seguinte, se eu não atribuisse um valor para Float x, ele receberia null, Então eu teria apenas um onjeto para ser coletado? Certo?
E se o Float x fosse float x? Eu também teria apenas um objeto a ser coletado, pois float x não é objeto então não fica no heap.
Certo?[/quote]
acho que, como o diego2005 citou, t1 ainda vai estar apontando para o objeto que você criou e, portanto, nenhum objeto estará elegível ao GC. Mas o que vc falou é verdade: quando um objeto for elegível ao GC se seus atributos forem do tipo referencia e tiverem algum objeto, esses objetos tb estarão elegíveis. Isso aconteceria no seu exemplo se vc comentasse a linha que faz Test t1 = t;