Смущен из-за инициализации переменных экземпляра - PullRequest
9 голосов
/ 22 ноября 2011

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

Iдумал, что это будет 21 20, так как ti вызовет getInt, который затем увеличивает k до 21.

Однако ответ - 1 20.Я не понимаю, почему это будет 1, кто-нибудь может пролить свет на это?

Ответы [ 2 ]

17 голосов
/ 22 ноября 2011

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

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

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

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

0 голосов
/ 24 ноября 2011

jvm будет выглядеть следующим образом:

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

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

...