Во-первых, JVM загружает все необходимые классы.Как часть этого, он будет запускать любые статические инициализаторы.
Хотя ваш код выглядит так, как будто он не в классе, Kotlin / JVM компилирует его в один;это будет поле для print_me
.(То, как это сделано, является подробностью реализации; это может быть статическое поле класса или экземпляра, на который ссылается статическое поле.) В любом случае это поле будет иметь инициализатор.
Теперь,тип print_me
равен Unit
.Это потому, что функция println()
не возвращает полезное значение.(Его единственная причина - побочный эффект.) Но JVM по-прежнему будет запускать инициализатор, который с радостью напечатает «2», прежде чем вернет Unit
, который присваивается print_me
.
Позже, когда классбыл инициализатором, среда выполнения будет вызывать вашу main()
функцию.
Конечно, статический инициализатор может вызывать все что угодно, так что он потенциально может делать все что угодно, прежде чем нажать на вашу main()
функцию.Но на практике такого не бывает много.