Uma classe interna é uma classe definida no interior de outra classe. Ela tem implicitamente uma referência para uma instância da classe externa e, por isso, pode utilizar as suas instâncias de variáveis, mesmo aquelas declaradas com o modificador
private. Observe o exemplo abaixo.
public class MyOuter{
private int x=7;
public void makeInner(){
MyInner in = new MyInner();
in.seeOuter();
}
public static void main(String args[]){
MyOuter o = new MyOuter();
o.makeInner();
}
class MyInner{
public void seeOuter(){
System.out.println("Outer x is: "+x);
}
}
}
É possível criar uma instância da classe interna apartir de outra classe que não lhe seja imediatamente externa:
public class Outra{
public static void main(String args[]){
MyOuter mo = new MyOuter();
MyOuter.MyInner inner = mo.new MyInner();
//Outra possibilidade:
//MyOuter.MyInner inner = new MyOuter().new MyInner();
inner.seeOuter();
}
}
O ponto é que uma instância da classe interna só pode ser criada a partir da classe que lhe é imediatamente externa.
Se, a partir de uma instância da classe interna MyInner, eu preciso fazer uma referência para a instância da classe externa MyOuter, então devo utilizar
this.MyOuter, enquanto
this refere-se normalmente à instância da classe interna.