Смущен из-за инициализации переменных экземпляра
Я готовлюсь к экзамену SCJP, после некоторых пробных испытаний я наткнулся на этот:
Он спрашивает, что является результатом следующего:
class TestClass
{
int i = getInt();
int k = 20;
public int getInt() { return k+1; }
public static void main(String[] args)
{
TestClass t = new TestClass();
System.out.println(t.i+" "+t.k);
}
}
Я думал, что это будет 21 20
, так как ti вызовет getInt, который затем увеличивает k до 21.
Тем не менее, ответ 1 20
, Я не понимаю, почему это будет 1, кто-нибудь может пролить свет на это?
2 ответа
Решение
Переменные инициализируются сверху вниз.
Вот что происходит:
- Изначально оба
i
а такжеk
иметь значение (по умолчанию)0
, - Значение, рассчитанное по
getInt()
(который в то время0 + 1
) назначенi
20
назначен наk
1 20
печатается.
Хорошее чтение:
JVM будет следующим образом,
1. Идентификация нестатических элементов сверху вниз 2. Выполнение нестатических переменных и блоков сверху вниз 3. Выполнение конструктора......
на первом шаге jvm предоставит значения по умолчанию.. при этом переменные времени в состоянии readindirectly только для записи.