Последовательность инициализации объекта в scala во внутренней иерархии
Вопрос
Я новичок в scala из java, и меня смущает последовательность инициализации объекта scala во внутренней иерархии. IIRC, в Java, если инициализируется объект подкласса, конструктор его базового класса вызывается перед любым кодом его собственного конструктора. В scala у меня совершенно другое поведение. Рассмотрим следующий пример:
родовое слово Давайте просто рассмотрим байт-код конструктора ColorPoint
, сброшенный вместе с javap
. Если код включает ключевую инструкцию println(name);
, байтовый код будет
Мы видим, что поле myColor
инициализируется после invokespecial
, то есть после инициализации базового класса.
Если я закомментирую оператор println(name);
, байтовый код будет следующим:
Мы видим, что поле myColor
инициализируется непосредственно перед invokespecial
, т.е. перед инициализацией базы.
Тогда в чем причина? Любой документ / статья описывает такое поведение?
Кстати, моя версия scala - 2.7.7final (OpenJDK Server VM, Java 1.6.0_20). Спасибо и наилучшими пожеланиями!
Решение
Компилятор просто выполняет все по порядку.Здесь есть документация.
https://github.com/paulp/scala-faq/wiki/Порядок инициализации
Основная его часть заключается в следующем.
<цитата>- Суперклассы полностью инициализируются перед подклассами.
- В противном случае - в порядке объявления.