При попытке получить доступ к статическому полю x через неинициализированную локальную переменную Foo foo; foo.x я получаю ошибку компиляции Variable 'foo' might not have been initialized.
class Foo{
public static int x = 1;
public static void main(String[] args) {
Foo foo;
System.out.println(foo.x); // Error: Variable 'foo' might not have been initialized
}
}
Может показаться, что эта ошибка имеет смысл, но только до тех пор, пока мы не поймем, что для доступа к члену static компилятор фактически не использует значение переменной, а только ее тип type.
Например, я могу инициализировать foo значением null, и это позволит нам получить доступ к x без проблем:
Foo foo = null;
System.out.println(foo.x); //compiles and while running prints 1!!!
Такой сценарий работает, потому что компилятор понимает, что x является статическим, и обрабатывает foo.x так, как он был написан как Foo.x (по крайней мере, я так думал до сих пор).
Так почему же компилятор вдруг настаивает на том, чтобы foo имел значение, которое он НЕ будет использовать в этом месте?
(Disclaimer: This is not code which would be used in real application, just interesting phenomenon which I couldn't find answer to on Qaru so I decided to ask about it.)