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?
interface Foo {
int bar();
}
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; }
}
System.out.println( fubar( new A()));
}
public static void main( String[] argv) {
new Beta().testFoo();
}
}
[quote=gumatias]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?
[/quote]
interface Foo {
int bar();
}
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; }
}
System.out.println( fubar( new A()));
}
public static void main( 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]
new Beta().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!
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.