Погляньте на код нижче:
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, тому вирішив запитати про це.