Комментарии 31
Первым делом статические переменные проинициализируются значениями по-умолчанию.
Далее, когда будет инициализироваться Foo.instance конструктор присвоит x = 0 + 0 = 0
После этого проинициализируются последовательно DELTA и BASE.
Выведет соответственно 0.
Думаю так, поправьте меня кто думает иначе или запускал и дебажил.
Далее, когда будет инициализироваться Foo.instance конструктор присвоит x = 0 + 0 = 0
После этого проинициализируются последовательно DELTA и BASE.
Выведет соответственно 0.
Думаю так, поправьте меня кто думает иначе или запускал и дебажил.
Ответ неверен.
Черт, не заметил final :)
Первым делом конечно будет инициализирована final DELTA, а с BASE все по старому.
Поэтому выведется 6.
Первым делом конечно будет инициализирована final DELTA, а с BASE все по старому.
Поэтому выведется 6.
Верно. Но не совсем. DELTA не инициализируется. Компилятор подставляет её как inline в с++. А что там с BASE?
А если
private static Foo instance = new Foo();
будет после
private static Foo instance = new Foo();
будет после
После Вашего ответа сразу стало всё понятно, спасибо.
Одно уточнение.
final атрибуты как токавые не инициируются. Их значения могут быть подставлены на этапе компиляции, то есть мы имеем сразу x = BASE + 6. Отсюда ответ будет 6.
Одно уточнение.
final атрибуты как токавые не инициируются. Их значения могут быть подставлены на этапе компиляции, то есть мы имеем сразу x = BASE + 6. Отсюда ответ будет 6.
выведет 6.
[догадки]потому, что создание нового экземпляра Foo вызывается до инициализации не-финальной переменной BASE, т.к. System.out.println(new Foo().x); работает нормально[/догадки]
[догадки]потому, что создание нового экземпляра 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?
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.
отсюда
отсюда
блин, я аж в календарь заглянул
Воистину, дата публикации предыдущей и следующей статей — десятое октября, а этой — восьмое. Это как так? Откуда хабр берет дату, которой помечает статью? неужто из компьютера загружающего?
выводит 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]
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 :).
А-ля:
А-ля:
Гм, в спецификации языка груви глава о классах пока не написана :( сорри. буду искать другие источники, писать в дев мейллист или читать код :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Пятничная задача