Смущен из-за инициализации переменных экземпляра

Я готовлюсь к экзамену 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 ответа

Решение

Переменные инициализируются сверху вниз.

Вот что происходит:

  1. Изначально оба i а также k иметь значение (по умолчанию) 0,
  2. Значение, рассчитанное по getInt() (который в то время 0 + 1) назначен i
  3. 20 назначен на k
  4. 1 20 печатается.

Хорошее чтение:

JVM будет следующим образом,

1. Идентификация нестатических элементов сверху вниз 2. Выполнение нестатических переменных и блоков сверху вниз 3. Выполнение конструктора......

на первом шаге jvm предоставит значения по умолчанию.. при этом переменные времени в состоянии readindirectly только для записи.

Другие вопросы по тегам