Pessoal, essa eh uma questao do Test Killer a respeito de classes internas, nao entendi nada disso, porque executa e resulta em 2?
a classe A que retorna 1 nao eh “vista”? nao entendi porque ele tem o trabalho de executar a classe interna que esta la dentro do metodo ao invez de executar que nao esta dentro de metodo nenhum…
Pessoal, essa eh uma questao do Test Killer a respeito de classes internas, nao entendi nada disso, porque executa e resulta em 2?
a classe A que retorna 1 nao eh “vista”? nao entendi porque ele tem o trabalho de executar a classe interna que esta la dentro do metodo ao invez de executar que nao esta dentro de metodo nenhum…
Alguem consegue me explicar?
interfaceFoo{intbar();}publicclassBeta{classAimplementsFoo{publicintbar(){return1;}}publicintfubar(Foofoo){returnfoo.bar();}publicvoidtestFoo(){classAimplementsFoo{publicintbar(){return2;}}System.out.println(fubar(newA()));}publicstaticvoidmain(String[]argv){//O método testFoo() tem a classe [b]A[/b] que implementa a interface Foo// Ainda dentro do método testFoo há uma chamada a fubar passando um [b]A[/b], nesse caso só pode ser a classe [b]A[/b]// do próprio método// Detalhe importante quando tiver classes internas de método elas só podem ser istanciadas dentro do corpo do método // e só podem usar variaveis de método marcadas com [b]final[/b]newBeta().testFoo();}}
Quanto a ter um monte de código que nem se quer é executado é comum no exame, podem ser pegadinhas para deixar em dúvida qual classe é usada ou erros de sintaxe.
E essas pegadinhas com certeza você verá no exame!
Espero ter sido claro o suficiente.
flw!
programadora
Olá…
nessa instrução aqui
que está dentro do método testFoo(), você passa a referência da classe interna local dentro do próprio método (note a forma como a classe foi instanciada), por isso, ele enxerga o resultado 2, pois dentro do método fubar(Foo foo), ele chama a versão da instância passada. Para ele retornar 1, ou seja, chamar a versão de bar() da classe interna
class A implements Foo {
public int bar() { return 1; }
}
você teria que passar uma instância dela para o método fubar(Foo foo), desta forma:
repare que para classes internas “comuns” você precisa instanciar antes sua superclasse e chamá-la a partir dessa instância, e na classe interna local de método, dentro do próprio método você só precisa instanciá-la normalmente.