Ostatnie pole i anonimowa klasa

Nadal nie jestem zadowolony z wyjaśnień dotyczących anonimowej klasy i ostatniego pola. Było mnóstwo pytań próbujących wyjaśnić oczywisty problem, ale nie znalazłem odpowiedzi na wszystkie moje pytania :-)

Załóżmy następujący kod:

public void method(final int i, int j) {
    final int z = 6;
    final int x = j;
    int k = 5;
    new Runnable() {
        public void run() {
            System.out.print(i);
            System.out.print(x);
            System.out.print(z);
            System.out.print(k);
        }
    };
}
Nie można skompilować tego kodu z powodu „unfinal”k własność.Rozumiem, że kompilator może zastąpićz właściwość o zadeklarowanej wartości podczas kompilacji.

Kiedy szukałem rozwiązania, jak dokładnie może działaći ix znalazłem toodpowiedź który mówi:

Kompilator może wtedy zastąpić użycie lastPrice i price w anonimowej klasie wartościami stałych (w czasie kompilacji, oczywiście), a nie będziesz mieć problemu z dostępem do nieistniejących zmiennych

Jak to może działać na polachi ix jeśli są to parametry metody? Nie są znane podczas kompilacji? Takie podejście może działaćz.

Z drugiej strony, istnieje wyjaśnienie dotycząceproblemy ze stosem:

Pozwala to kompilatorowi Java „przechwycić” wartość zmiennej w czasie wykonywania i zapisać kopię jako pole w klasie wewnętrznej. Po zakończeniu zewnętrznej metody i usunięciu ramki stosu oryginalna zmienna zniknie, ale prywatna kopia klasy wewnętrznej pozostanie w pamięci własnej klasy

Zrozumiałbym, że klasa anonimowa w jakiś sposób skopiowała całą wymaganą zawartość (pola) podczas jej tworzenia. Brakującyfinal ma oczywisty problem, jeśli jakiś kodponiżej anonimowa deklaracja klasy zmieniłaby wartość, możliwe wykonaniestale wartości.

Ale ok, powinno to rozwiązać problem, gdy metoda klasy anonimowej jest wykonywana poza zakresem używanych właściwości.

Ale to podejście powinno działaćparzysty bezfinal deklaracja, ponieważ po prostu kopiuje wszystkie pola.

Oba podejścia wydają mi się niezależne. A skoro o tym mowa - i to mogłoby rozwiązać moje pytania - nie znalazłem, jak działafinal pole metody. Nie są usuwane ze stosu, nawet jeśli metoda zostanie ukończona? Wydaje mi się to nonsensem, ale wyjaśniałoby wiele rzeczy :-)

Jaka jest prawidłowa odpowiedz?

questionAnswers(3)

yourAnswerToTheQuestion