¿Cómo pueden usarse los campos no finales en una clase de clase anónima si su valor puede cambiar?

Hice esta pregunta antes, pero no obtuve una respuesta adecuada.

¿Cómo pueden usarse los campos no finales en una clase de clase anónima si su valor puede cambiar?

class Foo{
    private int i;
    void bar(){
        i = 10
        Runnable runnable = new Runnable (){
            public void run (){
                System.out.println(i); //works fine
            }//end method run
        }//end Runnable
    }//end method bar
}//end class Foo 

Si las variables locales que se utilizan dentro de una clase anónima deben serfinal para habilitar al compilador incorporando sus valores dentro del código de clase anónimo de esa manera:

Antes de:

public class Access1 {
  public void f() {
    final int i = 3;
    Runnable runnable = new Runnable() {
        public void run() {
            System.out.println(i);
        }//end method run
    };//end anonymous class
  }//end method f
}//end class Access1

Después:

public class Access1 {
    public Access1() {}//end constructor

    public void f() {
        Access1$1 access1$1 = new Access1$1(this);
    }//end method f
}//end class Access1

Y

class Access1$1 implements Runnable {
    Access1$1(Access1 access1) {
        this$0 = access1;
    }//end constructor

    public void run() {
        System.out.println(3);
    }//end method run
    private final Access1 this$0;
}//end class Access1$1

Entonces¿Cómo puede el compilador en línea un valor de un campo no final?

Respuestas a la pregunta(1)

Su respuesta a la pregunta