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.xerzeugt Ü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 staticMitglied die JVM nicht wirklich verwendet den Wert einer Variablen, sondern nur seine Art .
Zum Beispiel kann ich foomit value initialisieren nullund dies ermöglicht uns den xproblemlosen Zugriff :
Foo foo = null;
System.out.println(foo.x); //compiles and at runtime prints 1!!!
Ein solches Szenario funktioniert, weil der Compiler erkennt, dass xes statisch ist und so behandelt, foo.xwie 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.