在Kotlin中,据说main
函数是入口点(即“ ...执行程序的第一条指令的位置...”,请参见here)。但是,以下代码在2
之前打印1
:
fun main(args: Array<String>) {
println("1")
}
var print_me = println("2")
为什么?
答案 0 :(得分:6)
首先,JVM加载所有必需的类。作为其一部分,它将运行任何静态初始化程序。
尽管您的代码看起来不在类中,但Kotlin / JVM将其编译为一个类;将会有一个print_me
的字段。 (如何完成的是实现细节;它可以是类上的静态字段,也可以是通过静态字段引用的实例上的静态字段。)无论如何,该字段都将具有初始化程序。
现在,print_me
的类型为Unit
。这是因为println()
函数没有返回有用的值。 (唯一的原因是它的副作用。)但是JVM仍将运行初始化程序,该初始化程序将在返回分配给Unit
的{{1}}之前愉快地打印“ 2”。
稍后,一旦类被初始化,运行时将调用您的print_me
函数。
当然,静态初始化程序可以调用您喜欢的任何东西,因此它可能会在执行main()
函数之前做各种事情。但实际上,这种情况不会发生太多。