Pessoal, será que alguém pode responder a seguinte questão pra mim:
Given:
10. public Object m() {
11. Object o = new Float(3.14F);
12. Object [] oa = new Object[1];
13. oa[0] = o;
14. o = null;
15. return oa[0];
16. }
When is the Float object, created in line 11, eligible for garbage collection?
A. Just after line 13.
B. Just after line 14.
C. Never in this method.
D. Just after line 15 (that is, as the method returns).
----------------------------------- Número de referências
10. public Object m() {
11. Object o = new Float(3.14F); 1 (o)
12. Object [] oa = new Object[1];
13. oa[0] = o; 2 (o, oa[0])
14. o = null; 1 (oa[0])
15. return oa[0]; 1
16. } 0 (se você não atribuir o retorno a outra variável)
A resposta no simulado é a letra B, mas eu achei que fosse a C, pois a variável oa[0] continua referênciando o objeto criado na linha 11, e ele é retornado pelo método:
Não da pra confiar nesses simulados mesmo, algumas questões que discordei da resposta eu digitei pra conferir, e algumas realmente estavam com a resposta errada…
O do Whizlabs eu baixei para ver as questões, mas na hora de conferir eu usei o velho e bom método de usar o compilador e escrever aqueles mini-programas que volta e meia vocês vêem postados aqui - ou então conferir no Javadoc ou no Java Language Specification.
Tatiana, valeu pelo artigo, o único problema é o inglês .
Thingol, fiz vários simulados e muitos tem erros.
Um que eu achei muito bom foi o do danch, pra mim foi o mais dificil e não achei nenhum erro, o do javacertificate também não achei erro, mas o nível de dificuldade é bem melhor que o do danch…
Pessoal, vou aproveitar o tópico e deixar + uma questão. Não sei se sou eu que não estou entendo o GC ou esse simulado que está errado.
Given:
1. class Bar { }
1. class Test {
2. Bar doBar() {
3. Bar b = new Bar();
4. return b;
5. }
6. public static void main (String args[]) {
7. Test t = new Test();
8. Bar newBar = t.doBar();
9. System.out.println(“newBar”);
10. newBar = new Bar();
11. System.out.println(“finishing”);
12. }
13. }
At what point is the Bar object, created on line 3, eligible for garbage collection?
A. After line 8.
B. After line 10.
C. After line 4, when doBar() completes.
D. After line 11, when main() completes.
Para facilitar um pouco a compreensão, vou alterar ligeiramente
o programa original, sem prejuízo da resposta.
--------------------------------------------------|-
1. class Bar {
int b;
Bar(int b) {
this.b = b;
}
}
1. class Test { |
2. Bar doBar() { |
3. Bar b = new Bar(3); |
4. return b; |
5. } |
6. public static void main (String args[]) { |
7. Test t = new Test(); |
8. Bar newBar = t.doBar(); | newBar contém Bar(3)
9. System.out.println(“newBar”); |
10. newBar = new Bar(10); | newBar contém agora Bar(10).
| Agora, Bar(3) não tem mais referências para ele, e está
| disponível para GC.
11. System.out.println(“finishing”); |
12. } |
13. } |
Dica: para resolver essas questões (que são meio chatinhas), use um esquema semelhante ao meu, com um quadrinho ao lado das linhas (se houver diversas variáveis, faça diversos quadrinhos, um para cada variável, para você poder acompanhar o valor do objeto que está sendo referenciado pela variável.)
Object [] oa = new Object[1]; 13. oa[0] = o; // mantem a referencia (indereço de memoria) de new Float(3.14F);
o = null;
return oa[0];
}
When is the Float object, created in line 11, eligible for garbage collection?
A. Just after line 13.
B. Just after line 14. C. Never in this method. D. Just after line 15 (that is, as the method returns).
oa[0] = o; // mantem a referencia (indereço de memoria) de new Float(3.14F);
o = null;
return oa[0];
}
When is the Float object, created in line 11, eligible for garbage collection?
A. Just after line 13.
B. Just after line 14. C. Never in this method. D. Just after line 15 (that is, as the method returns).
Vendo tantas justificativas diferentes vou postar a minha que tbem é diferente e vejam se vcs concordam?
public Object m() {
Object o = new Float(3.14F);
Object [] oa = new Object[1];
oa[0] = o; // mantem a referencia (indereço de memoria) de new Float(3.14F), porem o array oa tem escopo de função isso quer dizer que qdo a função retornar o array oa estara apto para ser coletado
o = null;
return oa[0];//Aqui que eu acho que é a grande sacada a metodo retorna new Float(3.14F) por intermedio de oa[0], isso me diz que Float so estara apto para coleta se quem chamou o metodo não guardar o retorno em uma váriavel de referencia
}
When is the Float object, created in line 11, eligible for garbage collection?
A. Just after line 13.
B. Just after line 14.
C. Never in this method. D. Just after line 15 (that is, as the method returns).
Não sei se estou falando besteira, mas o objeto criado na linha 11 (o) será elegível para ser coletado pelo Garbage Collection porque ele está apontando para null, na linha 14.
Antes ele estava apontando para objeto Float(3.14F). E oa[0] recebeu a referência do o antes de o aponta para null.
Será que estou errado? :shock:
[quote=diego2005]Pessoal, será que alguém pode responder a seguinte questão pra mim:
Given:
10. public Object m() {
11. Object o = new Float(3.14F);
12. Object [] oa = new Object[1];
13. oa[0] = o;
14. o = null;
15. return oa[0];
16. }
When is the Float object, created in line 11, eligible for garbage collection?
A. Just after line 13.
B. Just after line 14.
C. Never in this method.
D. Just after line 15 (that is, as the method returns).