Последовательность инициализации объекта в scala во внутренней иерархии

StackOverflow https://stackoverflow.com/questions/8353235

  •  27-10-2019
  •  | 
  •  

Вопрос

Я новичок в 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/Порядок инициализации

Основная его часть заключается в следующем.

<цитата>
  1. Суперклассы полностью инициализируются перед подклассами.
  2. В противном случае - в порядке объявления.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top