Kotlin中的main()函数之前执行了哪些指令?

时间:2019-06-19 17:31:16

标签: kotlin

在Kotlin中,据说main函数是入口点(即“ ...执行程序的第一条指令的位置...”,请参见here)。但是,以下代码在2之前打印1

fun main(args: Array<String>) {
    println("1")
}

var print_me = println("2")

为什么?

1 个答案:

答案 0 :(得分:6)

首先,JVM加载所有必需的类。作为其一部分,它将运行任何静态初始化程序。

尽管您的代码看起来不在类中,但Kotlin / JVM将其编译为一个类;将会有一个print_me的字段。 (如何完成的是实现细节;它可以是类上的静态字段,也可以是通过静态字段引用的实例上的静态字段。)无论如何,该字段都将具有初始化程序。

现在,print_me的类型为Unit。这是因为println()函数没有返回有用的值。 (唯一的原因是它的副作用。)但是JVM仍将运行初始化程序,该初始化程序将在返回分配给Unit的{​​{1}}之前愉快地打印“ 2”。

稍后,一旦类被初始化,运行时将调用您的print_me函数。

当然,静态初始化程序可以调用您喜欢的任何东西,因此它可能会在执行main()函数之前做各种事情。但实际上,这种情况不会发生太多。