10. interface Foo {
11. int bar();
12. }
13.
14. public class Beta {
15.
16. class A implements Foo {
17. public int bar() { return 1; }
18. }
19.
20. public int fubar( Foo foo) { return foo.bar(); }
21.
22. public void testFoo() {
23.
24. class A implements Foo {
25. public int bar() { return 2; }
26. }
27.
28. System.out.println( fubar( new A()));
29. }
30.
31. public static void main( String[] argv) {
32. new Beta().testFoo();
33. }
34. }
Which three statements are true? (Choose three.)
A. Compilation fails.
B. The code compiles and the output is 2.
C. If lines 16, 17 and 18 were removed, compilation would fail.
D. If lines 24, 25 and 26 were removed, compilation would fail.
E. If lines 16, 17 and 18 were removed, the code would compile and
the output would be 2.
F. If lines 24, 25 and 26 were removed, the code would compile and
the output would be 1.
Dúvida questão
12 Respostas
Af galera pode deixar eu vi aqui ja rsrs, ele atribiu um objeto A em um Foo e usa polimorfismo no método com sobrescriçao. vlw ai!!
a parte complicada nesses códigos é a má organização…
código não identado…
Pois é vmsb foi isso mesmo, as vezes da um embaralho por isso é bom prestar muito atenção.
Eu tentaria A, C, F. Não sei se está certo.
Estou estudando para a certificação também.
Só por curiosidade… a resposta corretá é (B,E,F)?
exatamente a resposta B,E,F.
Agora pensando aqui me deu uma duvida, pq ele faz chamada ao método da inner class local de método e não a inner class de instancia?
Ele deve levar em conta o escopo da chamada do método.
se trocar a linha:
System.out.println( fubar( new A()));
por:
System.out.println( fubar(new Beta().new A()));
O codigo irá compilar e executar a inner class da nova instancia de Beta.
acho que é isso…
porq ele sempre usa a clase mais especifica(no caso a que está dentro do método)…
se vc quiser chamar a da inner class vc terá que fazer assim:
System.out.println( fubar( new Beta().new A()));
para utilizar o objeto corrente de beta basta:
System.out.println( fubar(this.new A()));
assim usará o objeto que chamou o método testFoo.
me corrija se estiver errado por favor.
para utilizar o objeto corrente de beta basta:System.out.println( fubar(this.new A()));assim usará o objeto que chamou o método testFoo.
me corrija se estiver errado por favor.
tb funciona…
Legal…boa questão essa hein!!!
hum ok, obrigado a todos =D, so pra fazer uns testes aqui eu dei uma mudada no codigo e ele chamou a inner class de Beta:
package com.certificação.oo1;
public class Beta {
class A implements Foo {
public int bar() {
return 1;
}
}
public int fubar( Foo foo) {
return foo.bar();
}
public void testFoo() {
class A implements Foo {
public int bar() {
return 2;
}
} // fim da inner class local de método A
// System.out.println( fubar( new A()));
} // fim do método testFoo();
void go(){
System.out.println( fubar( new A()));
}
public static void main( String[] argv) {
new Beta().go();
}
}
Era o que vcs falaram mesmo ele chamou a inner class local pq de dentro do método testFoo() estava sendo chamado o metodo fubar(Foo foo) por isso a escolha da inner class local ehe, ja na mudança de cod executando o metodo go() onde o mesmo nao possui uma inner class local ele chamou a inner class da instancia.