preguntas de clase interna / externa de Java sobre acceso a variables privadas de clase externa

Tengo la siguiente clase de Java:

class Outer
{
    private Integer a;
    private Long b;

    class Inner
    {
        public void foo()
        { 
            System.out.println("a and b are " + a + " " + b);
        }
    }
}

cuando ejecuto javap en Outer y Outer $ Inner, obtengo lo siguiente:

C:\test>javap Outer
Compiled from "Outer.java"
class Outer extends java.lang.Object{
    Outer();
    static java.lang.Integer access$000(Outer);
    static java.lang.Long access$100(Outer);
}

C:\test>javap Outer$Inner
Compiled from "Outer.java"
class Outer$Inner extends java.lang.Object{    
    final Outer this$0;
    Outer$Inner(Outer);
    public void foo();
}

Tengo dos preguntas:

1) ¿por qué el compilador de Java genera métodos estáticos que toman el parámetro 'Outer', en la clase externa, para acceder a sus variables privadas? ¿por qué no los métodos de instancia que la clase interna puede llamar fácilmente a través de este miembro $ 0?

2) ¿por qué estos $ 0 en la clase interna se hacen finales? ¿Qué pasará si no es definitivo?

Gracias y saludos.

Respuestas a la pregunta(2)

Su respuesta a la pregunta