Chodzi o to, że metoda lokalne zmienne od rodzaju otaczającej rzeczywistości są kopiowane do wystąpień anonimowych klas (to dlatego, problemów związanych z ramką aktywacji, ale nie będę wchodził w szczegóły, ponieważ nie jest to istotne dla pytania), dlatego muszą być ostateczne, ponieważ zmienna w instancji typu zagnieżdżonego nie jest już taka sama.
Więc tutaj jest pierwszym przykładem:
void foo() {
int a = 3;
new Runnable() {
@Override
public void run() {
a += 3;
}
};
}
nie skompilować, ponieważ nie można odwoływać się do zmiennej non-końcowy w sposób anonimowy klasy. Po dodaniu ostatecznego modyfikatora do deklaracji a
, wartość a
zostanie skopiowana do utworzonej instancji klasy anonimowej, którą zdefiniowałeś. Jednak nie będzie można zmienić wartości a
, ponieważ zmiany nie będą widoczne dla metody, w której zadeklarowano a
.
Jednak anonimowe klasy nie są statyczne, to znaczy, że mają odwołanie do instancji zamykającego (chyba metody, gdzie są deklarowanej jest statyczna), które można wykorzystać do modyfikacji zmiennych instancji załączając:
int a = 3;
void foo() {
new Runnable() {
@Override
public void run() {
a += 3;
}
};
}
Ten przykład kompiluje i będzie zwiększał o a
o 3 za każdym razem, gdy wywoływana jest metoda run()
instancji klasy anonimowej. (W tym przykładzie nigdy nie jest wywoływana, ale jest to tylko przykład).
Podsumowując, należy przekonwertować zmienną seatno
z zmiennej lokalnej metody na zmienną instancji typu otaczającego.Lub, jeśli tak jest, musisz usunąć ostateczny modyfikator, ponieważ zmienne końcowe można przypisać tylko raz.
Aktualizacja: W Javie 8, pojęcie skutecznie końcowych zmiennych jest wprowadzony (patrz Java Language Specification). Jednak w pierwszym przykładzie tego wpisu zmienna a
jest przypisywana wiele razy, co uniemożliwia jej skuteczne zakończenie. Oznacza to, że ten przykład nadal nie jest kompilowany z językiem Java 8. (Błąd kompilacji to "Zmienna lokalna zdefiniowana w zasięgu obejmującym musi być ostateczna lub efektywna")
Twoja zmienna 'seatno' zawiera końcowe słowo kluczowe. –