【问题标题】:Why Kotlin allow write main function with no arguments?为什么 Kotlin 允许编写不带参数的 main 函数?
【发布时间】:2019-09-11 14:26:48
【问题描述】:

最近开始学习Kotlin,发现main()函数可以不带参数写成这样:

fun main() {
    dayOfWeek()
}

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

【问题讨论】:

  • 感谢您花时间学习新事物,而不是使用 stackoverflow 来修复错误:D.

标签: kotlin


【解决方案1】:

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

Java 虚拟机通过调用 main 方法开始执行 一些指定的类,传递给它一个参数,这是一个 字符串数组。

方法 main 必须声明为 public、static 和 void。它必须 指定一个声明类型为数组的形式参数(第 8.4.1 节) 细绳。因此,可以接受以下任一声明:

public static void main(String[] args) public static void 主要(字符串...参数)

Ref1, Ref2

所以是的,我们应该在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 代码。

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

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

【讨论】:

  • 您使用哪个 IDE 进行 Kotlin 开发? IntelliJ IDEA ?
  • 小毛病:它是调用main(String[])的JVM启动器,当然它对Kotlin一无所知。
【解决方案2】:

其他语言(如 C/C++)允许使用空参数列表的 main 函数。在幕后,它们只是通常的main 方法,参数被忽略。此功能纯粹是为了简化短程序和演示软件的语法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2015-02-02
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多