Uma classe interna pode ser criada no interior de um método. Neste caso, ela continuará tendo acesso às instâncias de variáveis da classe externa, mas não às variáveis locais do referido método, a não ser que elas sejam declaradas com o modificador
final. A razão disto é que as variáveis locais deixam de existir assim que o método é executado, enquanto a instância interna pode continuar existindo se ela passar a sua referência para algum outro objeto instanciado.
class MyOuter2{
private String x = "Outer2";
void doStuff(){
class MyInner{
public void seeOuter(){
System.out.println("Outer x is "+x);
}
}
MyInner mi = new MyInner();
mi.seeOuter();
}
public static void main(String args[]){
MyOuter2 mo = new MyOuter2();
mo.doStuff();
}
}