Как стать автором
Обновить

Комментарии 31

Первым делом статические переменные проинициализируются значениями по-умолчанию.
Далее, когда будет инициализироваться Foo.instance конструктор присвоит x = 0 + 0 = 0
После этого проинициализируются последовательно DELTA и BASE.
Выведет соответственно 0.
Думаю так, поправьте меня кто думает иначе или запускал и дебажил.
Ответ неверен.
Черт, не заметил final :)
Первым делом конечно будет инициализирована final DELTA, а с BASE все по старому.
Поэтому выведется 6.
Верно. Но не совсем. DELTA не инициализируется. Компилятор подставляет её как inline в с++. А что там с BASE?
А BASE проинициализируется после вызова конструктора и, соответственно, создания instance.
А если

private static Foo instance = new Foo();

будет после

private static int BASE = 7;

то выведется 13?

(компилятора нет, можете проверить?)
Да, именно так, выведется 13, т.к. переменные, арсположенные выше уже проинициализированны.
После Вашего ответа сразу стало всё понятно, спасибо.
Одно уточнение.
final атрибуты как токавые не инициируются. Их значения могут быть подставлены на этапе компиляции, то есть мы имеем сразу x = BASE + 6. Отсюда ответ будет 6.
Правильно!
выведет 6.
[догадки]потому, что создание нового экземпляра Foo вызывается до инициализации не-финальной переменной BASE, т.к. System.out.println(new Foo().x); работает нормально[/догадки]
Запускать то нельзя было.
НЛО прилетело и опубликовало эту надпись здесь
потому как язык интерпретируемый. Во всех интерпретируемых языках значение подставляется при выделении памяти.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Черт, вот что значит сидеть дома ,)
До вашего комментария я свято верил в то, что сегодня действительно пятница
public class Foo {
 private static Foo instance = new Foo();
 private const int DELTA = 6;
 private static int BASE = 7;
 private int x;
 private Foo() {
  x = BASE + DELTA;
 }
 public static void Main() {
  System.Console.Write(Foo.instance.x);
 }
}


C#. Как видно, код практически идентичен :) Выводит 6. Если заменить const int DELTA на static [readonly] — выводит 0.
Спасибо, интересно почему в AS3 все таки 13?
видимо в АС3 порядок выполнения другой ) на сколько я знаю он там по требованию.
Note that static constructor is called when the class is loaded at the first time. However we can't predict the exact time and order of static constructor execution. They are called before an instance of the class is created, before a static member is called and before the static constructor of the derived class is called.

отсюда
блин, я аж в календарь заглянул
Воистину, дата публикации предыдущей и следующей статей — десятое октября, а этой — восьмое. Это как так? Откуда хабр берет дату, которой помечает статью? неужто из компьютера загружающего?
Я её опубликовал 8го. На главную просто вышла только сегодня.
выводит 6 :)

ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [../../../src/share/back/util.c:820]
А эта ошибка к чему бы?
Тот же самый код (в точности) скомпилировал компилятором Groovy, запустил — выводит 13 :).

А-ля:

D:\sandbox\groovy>«c:\Program Files\Groovy\Groovy-1.7.5\bin\groovyc» test.groovy

D:\sandbox\groovy>«c:\Program Files\Groovy\Groovy-1.7.5\bin\groovy» test
13
Пошел читать Groovy Lang Spec :)
Гм, в спецификации языка груви глава о классах пока не написана :( сорри. буду искать другие источники, писать в дев мейллист или читать код :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории