W jaki sposób pola nie-końcowe mogą być używane w anonimowej klasie, jeśli ich wartość może ulec zmianie?

Zadałem to pytanie wcześniej, ale nie otrzymałem odpowiedniej odpowiedzi.

W jaki sposób pola nie-końcowe mogą być używane w anonimowej klasie, jeśli ich wartość może ulec zmianie?

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 

Jeśli lokalne zmienne używane w anonimowej klasie muszą byćfinal aby umożliwić kompilatorowi wstawianie ich wartości do anonimowego kodu klasy w następujący sposób:

Przed:

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

Po:

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

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

I

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

Następniew jaki sposób kompilator może wyznaczyć wartość pola innego niż końcowe?

questionAnswers(1)

yourAnswerToTheQuestion