【发布时间】:2019-09-11 14:26:48
【问题描述】:
最近开始学习Kotlin,发现main()函数可以不带参数写成这样:
fun main() {
dayOfWeek()
}
这怎么可能?Kotlin 在幕后做了什么?
Java 不允许我们这样做。
【问题讨论】:
-
感谢您花时间学习新事物,而不是使用 stackoverflow 来修复错误:D.
标签: kotlin
最近开始学习Kotlin,发现main()函数可以不带参数写成这样:
fun main() {
dayOfWeek()
}
这怎么可能?Kotlin 在幕后做了什么?
Java 不允许我们这样做。
【问题讨论】:
标签: kotlin
main 的签名基于 Java 虚拟机的期望:
Java 虚拟机通过调用 main 方法开始执行 一些指定的类,传递给它一个参数,这是一个 字符串数组。
方法 main 必须声明为 public、static 和 void。它必须 指定一个声明类型为数组的形式参数(第 8.4.1 节) 细绳。因此,可以接受以下任一声明:
public static void main(String[] args) public static void 主要(字符串...参数)
所以是的,我们应该在main 方法中定义一个数组字符串参数。但是,正如你所问,
这怎么可能?Kotlin 在后台做了什么?
让我们看看,
Kotlin 代码
// fileName : Main.kt
fun main() {
println("Hello World!")
}
编译的 Java 代码
public final class MainKt {
public static final void main() {
String var0 = "Hello World!";
System.out.println(var0);
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
}
如您所见,在编译后的 Java 代码中,Kotlin 使用方法重载来调用带有 String[] 参数的 main 方法。由此我们可以理解,Koltin 只是帮助我们节省了时间,让语法更具可读性。
在内部,Kotlin 使用 String[] 参数调用 main 方法。
提示
如果您使用的是 IntelliJ IDEA,则可以使用内置的 Kotlin 工具查看编译后的 Java 版本的 Kotlin 代码。
Menu > Tools > Kotlin > Show Kotlin BytecodeDecompile按钮您可以从here找到带有屏幕截图的简单指南
【讨论】:
main(String[])的JVM启动器,当然它对Kotlin一无所知。
其他语言(如 C/C++)允许使用空参数列表的 main 函数。在幕后,它们只是通常的main 方法,参数被忽略。此功能纯粹是为了简化短程序和演示软件的语法
【讨论】: