При попытке получить доступ к статическому полю 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.)