为什么Kotlin允许写不带参数的main函数?

Naz*_*kiy 3 kotlin

最近,我开始学习Kotlin并发现该main()函数可以不带以下参数来编写:

fun main() {
    dayOfWeek()
}
Run Code Online (Sandbox Code Playgroud)

这怎么可能Kotlin?幕后在做什么? Java不允许我们这样做。

the*_*e64 7

main的签名基于Java虚拟机的期望:

Java虚拟机通过调用某些指定类的方法main并将其传递给单个参数(该参数是字符串数组)来开始执行。

方法main必须声明为public,static和void。它必须指定一个声明的类型为String数组的形式参数(第8.4.1节)。因此,可以使用以下任何一种声明:

公共静态void main(String [] args)公共静态void main(String ... args)

REF1至Ref2

因此,是的,我们应该在main方法中定义一个数组字符串参数。但是,正如你问的那样,

这怎么可能?科特林在幕后做什么?

让我们来看看,

科特林代码

// fileName : Main.kt
fun main() {
    println("Hello World!")
}
Run Code Online (Sandbox Code Playgroud)

编译的Java代码

// fileName : Main.kt
fun main() {
    println("Hello World!")
}
Run Code Online (Sandbox Code Playgroud)

如您所见,在编译的Java代码中,Kotlin使用方法重载来调用main带有String[]参数的方法。由此,我们可以了解到Koltin只是在帮助我们节省时间并提高语法可读性。

在内部,Kotlin用String[]参数调用main方法。

小费

如果使用的是IntelliJ IDEA,则可以使用内置的Kotlin工具查看Kotlin代码的编译Java版本。

  1. Menu > Tools > Kotlin > Show Kotlin Bytecode
  2. 点击Decompile按钮

您可以从此处找到带有屏幕截图的简单指南

  • 小问题:它是 JVM 启动器调用 main(String[]) ,当然它对 Kotlin 一无所知。 (2认同)