Eu estou tendo dúvidas com relação a classes internas. Gostaria de entender a ordem de chamada da função m(), descrita abaixo:[/b]
class A {
void m(){
System.out.println("outer");
}
}
public class TestInners {
public static void main(String[] args) {
new TestInners().go();
}
void go() {
new A().m();
class A {
void m() {
System.out.println("inner");
}
}
}
class A{
void m(){
System.out.println("middle");
}
}
}
Há três funções m(). Por que é chamada a “middle” ?
Obrigado!!
Quando você faz referência a uma classe, o compilador busca essa classe do escopo mais interno para o mais externo. Assim, se a referência ocorre dentro de um método, a ordem de busca é classes locais, classes aninhadas e finalmente top-level classes. No seu caso, essa ordem deveria ser “inner” , “middle” e “outter”. Porém, como a criação do objeto e a chamada de m() ocorrem antes da declaração de “inner” essa classe ainda não existe no escopo local. Assim, ela busca no escopo da classe e encontra a declaração “middle”, e a usa para criar o objeto e chamar m().
package com.wilson.classeinterna;
import com.wilson.classeinterna.ClasseExterna_ex3.ClasseInterna;
public class ClasseExterna_ex3
{
int var = 6;
protected void ChamaFuncaoInterna()
{
ClasseInterna i = new ClasseInterna();
i.f();
}
protected class ClasseInterna
{
protected void f()
{
System.out.println(var);
}
}
public static void main(String []args)
{
ClasseExterna_ex3 e = new ClasseExterna_ex3();
e.ChamaFuncaoInterna();
}
}
O código acima funciona, mas não sei por que não poderia ser assim:
package com.wilson.classeinterna;
import com.wilson.classeinterna.ClasseExterna_ex3.ClasseInterna;
public class ClasseExterna_ex3
{
int var = 6;
protected class ClasseInterna
{
protected void f()
{
System.out.println(var);
}
}
public static void main(String []args)
{
ClasseInterna i = new ClasseInterna();
i.f();
}
}