perguntas de classe interna / externa de java sobre acesso a variáveis privadas de classe externa

Eu tenho a seguinte classe java:

class Outer
{
    private Integer a;
    private Long b;

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

Quando executo o javap em Outer e Outer $ Inner, recebo o seguinte:

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

Eu tenho duas perguntas:

1) por que o compilador java gera métodos estáticos que usam o parâmetro 'Outer', na classe externa, para acessar suas variáveis privadas? por que não exemplos de métodos que a classe interna pode chamar facilmente através desse membro de US $ 0?

2) por que esses $ 0 na classe interna são finalizados? o que acontecerá se não for final?

Obrigado e cumprimentos.