Schauen Sie sich den folgenden Code an:
class Foo{
public static int x = 1;
}
class Bar{
public static void main(String[] args) {
Foo foo;
System.out.println(foo.x); // Error: Variable 'foo' might not have been initialized
}
}
Wie Sie sehen , während für den Zugriff statischen Feldes versuchen x
über einen nicht initialisierte lokalen Variable Foo foo;
Code foo.x
erzeugt Übersetzungsfehler: Variable 'foo' might not have been initialized
.
Es könnte scheinen , wie dieser Fehler macht Sinn, aber nur , bis wir erkennen , dass ein Zugriff auf static
Mitglied die JVM nicht wirklich verwendet den Wert einer Variablen, sondern nur seine Art .
Zum Beispiel kann ich foo
mit value initialisieren null
und dies ermöglicht uns den x
problemlosen Zugriff :
Foo foo = null;
System.out.println(foo.x); //compiles and at runtime prints 1!!!
Ein solches Szenario funktioniert, weil der Compiler erkennt, dass x
es statisch ist und so behandelt, foo.x
wie es geschrieben wurde Foo.x
(zumindest dachte ich das bis jetzt).
Warum besteht der Compiler plötzlich darauf foo
, einen Wert zu haben, den er überhaupt nicht verwendet ?
Haftungsausschluss: Dies ist kein Code, der in einer realen Anwendung verwendet werden würde, sondern ein interessantes Phänomen, auf das ich bei Stack Overflow keine Antwort finden konnte. Deshalb habe ich mich entschlossen, danach zu fragen.