Погляньте на код нижче:
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
}
}
Як ви бачите , при спробі поля статичного доступу x
через неініціалізованих локальну змінну Foo foo;
коду foo.x
генерує помилку компіляції: Variable 'foo' might not have been initialized
.
Це може здатися , як ця помилка має сенс, але тільки поки ми не усвідомлюємо , що для доступу до static
члену віртуальна машина практично не використовувати в значення змінної, а тільки його тип .
Наприклад, я можу ініціалізувати foo
значенням, null
і це дозволить нам отримати доступ x
без будь-яких проблем:
Foo foo = null;
System.out.println(foo.x); //compiles and at runtime prints 1!!!
Такий сценарій працює, тому що компілятор розуміє, що x
це статично, і поводиться так, foo.x
як було написано Foo.x
(принаймні, так я думав дотепер).
То чому компілятор раптом наполягає на foo
значенні, яке він взагалі НЕ використовуватиме ?
Застереження: Це не код, який буде використовуватися в реальному застосуванні, а цікаве явище, на яке я не зміг знайти відповіді у Stack Overflow, тому вирішив запитати про це.