Ich habe ein Problem mit lokalen Variablen Zugriff auf innere Klasse muss endgültig erklärt werden. Es stammt von der Methode createGrids () - & gt; " squares[i][j] = 0;
", dass i eine lokale Variable ist, die als final deklariert werden muss. Ich weiß nicht warum und ich habe das letzte in Feldern hinzugefügt, aber es funktioniert nicht so gut.
// weggelassen
%Vor% Anonyme innere Klassen haben Zugriff auf lokale Variablen durch einen Trick hinter den Kulissen. Lokale Variablen werden als versteckte Member-Variablen der inneren Klasse implementiert. Sie sind Kopien der lokalen Variablen zugewiesen. Um zu verhindern, dass der Kopierwert falsch ist, erzwingt der Java-Compiler, dass diese lokalen Variablen final
sein müssen, damit sie nicht geändert werden, damit die Kopie korrekt bleibt.
Die Felder der einschließenden Klasse müssen nicht final
sein; Die verwendeten lokalen Variablen müssen final
sein. Sie müssen alle lokalen Variablen in Ihrer anonymen inneren Klasse final
verwenden. Sie können dies tun, indem Sie die final
-Variablen für Ihre Werte i
und j
initialisieren und sie in Ihrer anonymen inneren Klasse verwenden.
Beachten Sie, dass dies in Java 8 nicht erforderlich wäre, da der Java 8-Compiler erkennen kann, ob die in anonymen inneren Klassen verwendeten lokalen Variablen "effektiv final" sind, also nicht final
, aber nach der Initialisierung nie geändert wurden.
In diesem Fall erstellen Sie 81 ActionListener-Klassen, jede mit ihrer eigenen Methode actionPerformed
. Aber wenn diese Methode ausgeführt wird, weiß die Klasse nicht, was der Wert von i
und j
mehr ist, da sie sie weit zurückgelassen hat.
Java verhindert dies, daher der Compilerfehler. Es erfordert, dass alle referenzierten lokalen Variablen endgültig sind, damit sie an die erstellten Klassen übergeben werden können.
Der einfachste Weg, dies zu lösen, ist ein Paar final
Variablen innerhalb Ihrer Schleifen zu erstellen:
Tags und Links java scope anonymous-class