Hummm analisando bem acho que 1 objeto. Afinal de contas voce instancia um o2 pra poder instanciar um o4 … acho que o o2 vai pro GC pois a variavel referencia apenas o o4 … certo ?
Entao justamente, por ele nao ser referenciado ele é criado e ja disponibilizado pro GC certo ???
Bom tenho quase certeza que é isso. A menos que esteja muito enganado hehehe…[/quote]
Ele não é disponibilizado tão rápido assim. Quando a primeira vez que o GC for executado, ele identificará que o objeto está “livre” e o marcará para recolhimento. Numa segunda vez que o GC executar, ele será “limpo”, executando o método finalize() do objeto e agora realmente liberando memória. Muita gente ainda acha que logo depois de “liberado” o objeto e logo após a primeira execução do GC a memória será liberada por completo.
A resposta correta é realmente nenhum, porque todos os objetos são referenciados por objetos válidos (não elegíveis)
OO4 o4 = new OO2().new OO4();
O código acima instância um OO2 para poder instanciar OO4 e embora o objeto OO2 não seja mais usado ele é referenciado por OO4 já que OO4 é uma inner class de OO2. Como tal , mesmo esse objeto auxiliar não é elegível.
Na minha opinição, o objeto “auxiliar” do tipo OO2 criado em
será sim elegível para o GC… pois ele está sendo utilizado apenas para criar OO4 (e sua referência não está sendo colocada em nenhuma variável), o objeto do tipo OO4 criado a partir daquele do tipo OO2 não tem nenhuma referência para ele (o fato de ele ser inner classe não garante isso)…
complementando o comentário do maquiavelbona:
Na verdade, não necessariamente após o método finalize() o objeto será liberado da memória, pois é possível que o método finalize() guarde a referência de this em um outro local (por exemplo, uma variável estática de outra classe) e, nesse caso, ainda não seria recolhido da memória… Além disso, vale lembra rque o método finalize() só é executado uma vez em cada objeto, o que significa que se ele ja executou o finalize() e foi guardada sua referência em um outro local… se pela segunda vez não tivermos mais nenhuma referência ao objeto, quando chegar o momento do GC fazer a coleta o objeto será removido sem executar novamente o método finalize().
A resposta é 0(zero objetos estarão disponiveis para o gc).
pensem:
004 é inner de 002 e sendo assim tem acesso às variaveis de instancia e metodos do objeto do tipo 002 à qual ele foi referenciado no momento em que foi instanciado. Apesar de o obj 002 não possuir uma variavel de referencia que o aponte, ainda é possivel que o objeto 004 deseje acessar seus métodos ou variáveis, sendo assim ainda é necessário mante-lo na memória.
Concordam?
Me desejem boa sorte, pq amanhã é meu exame de SCJP…
[quote=RafaelVS]Na minha opinição, o objeto “auxiliar” do tipo OO2 criado em
será sim elegível para o GC… pois ele está sendo utilizado apenas para criar OO4 (e sua referência não está sendo colocada em nenhuma variável), o objeto do tipo OO4 criado a partir daquele do tipo OO2 não tem nenhuma referência para ele (o fato de ele ser inner classe não garante isso)…
[/quote]
Garante sim senhor. Dentro de OO4 tenho que poder executar o seguinte código
public algumMetodoDeOO4 (){
OO2.this.algumMetodoDeOO2();
}
Para que isto seja possível, OO4 sempre tem uma referencia a OO2 que pode ser obtida com OO2.this . Se tem duvidas use um debugger e veja que existe uma variável dentro do OO4 que aponta para OO2.
Caiu bastante fundamentos(E eu que achava que era bom nisto)… foi onde mais errei. E em Collection que achava que iria ir mau, foi onde foi melhor… vai entender…