Classes internas (Inner classes)

[b]Olá!

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!!

acho q é pq ela está embaixo da classe q vc crio nesse bloco … tente criar a classe e depois chamar o método para ver o resultado.

    void go() {     

        class A {     
             void m() {     
                 System.out.println("inner");     
             }     
        }
     
       new A().m();          
    } 

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().

[b]Vlw pela resposta!
Agora, como seria se eu quisesse chamar o médoto m() da classe A?

[/b]

Qual das três :shock: ???

Foi mal! “outer”. A mais externa.

Nesse caso acho que não tem muita alternativa não. Acho que só qualificando a classe ou mudando o nome logo de uma vez.

Se a tua classe estiver dentro de uma package podes fazer:new packageName.A().m();

Eu tenho uma outra dúvida…


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();
		
	}
}

Porque a tua classe interna não é static e sendo assim, só faz sentido no contexto de uma classe externa.

Eu não entendi…

:?:

Alguém poderia me explicar melhor???
Eu não entendi…