Letztes Feld und anonyme Klasse

Ich bin immer noch nicht zufrieden mit der Erklärung der anonymen Klasse und des letzten Feldes. Es gab Unmengen von Fragen, die versuchten, ein offensichtliches Problem zu erklären, aber ich habe keine Antworten auf alle meine Fragen gefunden :-)

Angenommen, folgender Code:

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);
        }
    };
}
Es ist nicht möglich, diesen Code zu kompilieren, da "unfinal"k Eigentum.Ich verstehe, dass Compiler ersetzen kannz Eigenschaft mit dem deklarierten Wert während der Kompilierungszeit.

Wenn ich nach einer Lösung gesucht habe, wie genau kann das funktionieren?i undx ich habe das gefundenAntworten was sagt:

Der Compiler kann dann einfach die Verwendung von lastPrice und price in der anonymen Klasse durch die Werte der Konstanten ersetzen (natürlich zur Kompilierungszeit), und Sie haben kein Problem mehr mit dem Zugriff auf nicht vorhandene Variablen

Wie es für Felder funktionieren könntei undx ob sie Parameter der Methode sind? Sie sind während der Kompilierungszeit nicht bekannt? Dieser Ansatz kann funktionierenz.

Auf der anderen Seite gibt es eine Erklärung zuStapelprobleme:

Auf diese Weise kann der Java-Compiler den Wert der Variablen zur Laufzeit "erfassen" und eine Kopie als Feld in der inneren Klasse speichern. Sobald die äußere Methode beendet wurde und ihr Stapelrahmen entfernt wurde, ist die ursprüngliche Variable nicht mehr vorhanden, aber die private Kopie der inneren Klasse verbleibt im eigenen Speicher der Klasse

Ich würde verstehen, dass anonyme Klasse irgendwie alle erforderlichen Inhalte (Felder) während seiner Erstellung kopiert. Fehltfinal hat offensichtlich problem das wenn irgendein codeunten Eine anonyme Klassendeklaration würde den Wert ändern, die verwendete Ausführung wäre möglichstale Werte.

Aber ok, dies sollte das Problem lösen, wenn die Methode der anonymen Klasse außerhalb des Bereichs der verwendeten Eigenschaften ausgeführt wird.

Aber dieser Ansatz sollte funktionierensogar ohnefinal Deklaration, da nur alle Felder kopiert werden.

Beide Ansätze erscheinen mir unabhängig. Apropos - und es könnte meine Fragen lösen - ich habe nicht gefunden, wie das funktioniertfinal Methodenfeld. Sie werden nicht vom Stapel entfernt, auch wenn die Methode abgeschlossen ist? Scheint mir Unsinn zu sein, aber es würde viele Dinge erklären :-)

Was ist die korrekte Antwort?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage