Inner classes

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.