Ich habe diesen Teil des Codes geschrieben und es scheint, dass der Compiler den Zugriff auf das nicht initialisierte leere letzte Feld erlaubt, wenn er mit dem Schlüsselwort 'this' angesprochen wird:
%Vor%Ich habe versucht, es auf 1.5, 1.6, & amp; 1,7 und bekam das gleiche Ergebnis in allen dreien.
Für mich sieht das aus wie ein Compiler-Fehler, weil der Compiler in diesem Fall einen Fehler erzeugen muss, aber mit 'diesem' Schlüsselwort nicht und erzeugt somit einen Bereich von Codierungsfehlern, da er vom Programmierer seit der Kompilierung oder Ausführung nicht bemerkt wird Zeitfehler wird ausgelöst.
Einige Punkte, warum es sich nicht um ein Duplikat handelt
- Alle Antworten erklären, wie es funktioniert und was JLS sagt, gut, aber meine wirkliche Absicht hier ist, sollte das an erster Stelle erlaubt sein?
- Meine Frage hier ist mehr aus Sicht des Programmierers und nicht Sprachsemantik
Dies ist kein Fehler. Dies ist eine Funktion für Java Specification 1.6 und niedriger.
Auf das letzte Feld kann in jedem Teil des Codes zugegriffen werden. Es gibt keine Einschränkung.
Die einzige Einschränkung im letzten Fall ist, dass sie initialisiert werden muss, bevor die Klasseninstanz erstellt wird.
Wenn Sie this
verwenden, drücken Sie aus, dass es sich um ein Element des Objekts handelt, das gerade konstruiert wird.
Seit der Spezifikation 1.7 wegen Änderung wir können sagen, dass dies ein Fehler in einigen Implementierungen von Compilern ist.
Aber seit 1.8 wird der Code den gleichen Fehler für this.value1
oder value1
erzeugen.
In Java-Ints ist der Standardwert 0 angegeben. Selbst wenn Sie ihn nicht initialisiert haben, hat der Compiler immer noch 0 als Wert zugewiesen.
Felder, die deklariert, aber nicht initialisiert sind, werden vom Compiler auf einen angemessenen Standard gesetzt. Im Allgemeinen ist dieser Standardwert je nach Datentyp Null oder Null.
Quelle: Ссылка
Beachten Sie, dass dies nicht für lokale Variablen gilt, nur Feldvariablen haben einen Standardwert.
Ich habe den folgenden Code verwendet
%Vor%und der von ihm erzeugte Bytecode ist
%Vor% Wenn Sie bemerken, dass JVM einen getstatic
Aufruf im Falle von final und getfield
im Fall einer normalen Instanzvariablen ausführt. Auch jetzt, wenn Sie sich die Spezifikationen für getstatic es sagt
Bei erfolgreicher Auflösung des Feldes wird die Klasse oder Schnittstelle, die das aufgelöste Feld deklariert hat, initialisiert (§5.5), wenn diese Klasse oder Schnittstelle noch nicht initialisiert wurde.
Wenn Sie also eine Endvariable verwenden, wird sie initialisiert. Nicht initialisiert this.value1
und nicht value1
, was endgültig ist. Sie müssen es noch vor der Verwendung initialisieren.
Tags und Links java initialization javac final