вопросы о внутреннем / внешнем классе Java о доступе к частным переменным внешнего класса

У меня есть следующий класс Java:

class Outer
{
    private Integer a;
    private Long b;

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

когда я запускаю javap для Outer и Outer $ Inner, я получаю следующее:

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

У меня есть два вопроса:

1) почему java-компилятор генерирует статические методы, которые принимают параметр 'Outer' во внешнем классе для доступа к своим закрытым переменным? почему бы не создать экземпляры методов, которые внутренний класс может легко вызвать через свой член $ 0?

2) почему этот $ 0 во внутреннем классе сделан окончательным? что будет если не окончательно?

Спасибо и всего наилучшего.

Ответы на вопрос(2)

Ваш ответ на вопрос