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

在Kotlin中的main()函数之前执行哪些指令?,kotlin,Kotlin,在Kotlin中,据说main函数是入口点(即“…执行程序的第一条指令的地方…”,请参阅)。但是,以下代码在1之前打印2: fun main(args: Array<String>) { println("1") } var print_me = println("2") fun main(args:Array){ println(“1”) } 变量print_me=println(“2”) 为什么?首先,JVM加载任何必需的类。作为这一过程的一部分,它将运行任何静态初

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

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

var print_me = println("2")
fun main(args:Array){
println(“1”)
}
变量print_me=println(“2”)

为什么?

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

尽管您的代码看起来不在类中,但Kotlin/JVM将其编译为一个类;这将有一个字段用于
print\u me
(如何完成是一个实现细节;它可能是类上的一个静态字段,也可能是通过静态字段引用的实例上的一个静态字段)。在任何情况下,该字段都将有一个初始化器

现在,
print\u me
的类型是
Unit
。这是因为
println()
函数没有返回有用的值。(其唯一原因是它的副作用。)但是JVM仍然会运行初始化器,它会在返回分配给
print\u me
Unit
之前愉快地打印“2”

稍后,初始化类后,运行时将调用
main()
函数


当然,静态初始化器可以调用您喜欢的任何东西,因此在调用
main()
函数之前,它可能会执行各种操作。但在实践中,这种情况不会太多。

自上而下初始化变量,然后调用
main