Eine statische Endvariable muss vor der Verwendung initialisiert werden. Es kann entweder direkt zur Deklarationszeit oder in einem statischen Block initialisiert werden.
Aber wenn Sie class.var = x
verwenden, wird es nicht als eine Initialisierung, sondern als eine Zuweisung gesehen.
Bei einem JDK 7 kann der Fehler der endgültigen Variablen keinen Wert zuweisen.
Das erklärt, warum es funktioniert, wenn Sie das final
Stichwort entfernen
class Test {
static final int a = 2; // initialization at declaration time
static final int b;
static final int c;
static {
b = 4; // initialization in static block
Test.c = 6; // error : cannot assign a value to final variable c
}
...
}
EDIT
Im JLS das richtige Wort für die Initialisierung ist definitiven assignement
Auszug aus dem JLS:
Für jeden Zugriff eines lokalen v Das letzte Feld x, x muss definitiv vor dem Zugriff zugewiesen sein, oder es tritt ein Fehler bei der Kompilierung auf.
Ebenso muss jede leere letzte Variable höchstens einmal zugewiesen werden; es muss definitiv nicht zugewiesen sein, wenn eine Zuweisung zu ihm auftritt.
Eine solche Zuweisung definiert ist, wenn das Auftreten und nur dann, wenn entweder die einfache Name der Variable (oder, für ein Feld, ihren einfachen Namen dadurch qualifiziert) auf der linken Seite eines auftritt Aufgabenverwalter.
Für jede Zuordnung zu einer leeren letzten Variable, muss die Variable vor der Zuweisung definitiv nicht zugeordnet sein, oder ein Fehler bei der Kompilierung auftritt.
betonen meine, aber ich denke, das ist der wahre Grund für den Fehler.
Weil Ihre Klasse noch nicht initialisiert ist, wenn Sie sich in einem statischen Initialisierer befinden? Auch wahrscheinlich, weil die JLS es verbietet ... – fge
Interessieren Sie sich für "welches Bit der JLS verbietet das" oder "Warum wurde die Sprache so entworfen?"? –
Könnte hier falsch sein, aber vielleicht ist es, weil Sie 'Test.b' als' final' deklariert haben –