当前位置: 首页 > 知识库问答 >
问题:

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

幸鸿轩
2023-03-14

最近,我开始学习kotlin,并琢磨出main()函数可能是这样没有参数编写的:

fun main() {
    dayOfWeek()
}

这是怎么可能的,以及kotlin在引擎盖下正在做什么?java不允许我们这样做。

共有1个答案

锺离嘉容
2023-03-14

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

Java虚拟机通过调用某个指定类的方法main,向它传递一个参数(字符串数组)来开始执行。

方法main必须声明为public、static和void。它必须指定一个声明类型为字符串数组的形参(§8.4.1)。因此,下列任何一种声明都是可以接受的:

public static void main(String[]args)public static void main(String...args)

Ref1、Ref2

所以是的,我们应该在main方法中定义一个数组字符串param。但是,正如你所问的,

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只是帮助我们节省时间,使语法更易读。

小费

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

  1. 菜单>工具>Kotlin>显示Kotlin字节码
  2. 单击反编译按钮

您可以从这里找到带有截图的简单指南

 类似资料:
  • 当重写超类的方法时,Java 允许返回类型是协变的。 为什么在覆盖方法时不允许相反的逆变参数类型?

  • 问题内容: 我刚接触PHP,但是多年来我一直在使用类似的语言进行编程。我被以下内容弄糊涂了: 它产生了语法错误:这就是调用。 但这很好用: 碰了一会儿之后,我被告知您不能在默认属性中调用函数。你必须在做。我的问题是:为什么?这是“功能”还是草率的实现?有什么根据? 问题答案: 编译器代码建议这是设计使然,尽管我不知道其背后的官方原因是什么。我也不确定要可靠地实现此功能需要花费多少精力,但是目前完成

  • 问题内容: 来自C语言的Go语言最值得注意的方面之一是,如果在其中声明了一个未使用的变量,编译器将不会编译您的程序。那么,如果在函数中声明了一个未使用的参数,那么为什么要构建此程序呢? 问题答案: 没有正式的原因,但是在golang-nuts上给出的原因是: 未使用的变量始终是编程错误,而编写不使用其所有参数的函数是很常见的。 可以将这些参数保留为未命名(使用_),但这可能会与诸如 func fo

  • 我们有一个员工姓名表,其中列有ID、name、salary 查询1不起作用,但查询2起作用。从我的开发经验来看,我觉得对此可能的解释是: sum()处理参数中指定的一组值。这里传递了'salary'列,因此它必须将此列的所有值相加。但是在where子句中,记录是一个接一个地检查的,就像第一条记录1是为了测试而检查的,等等。因此,不会计算sum(工资),因为它需要访问所有列的值,然后只有它返回一个值

  • 我有以下课程: 但当我想让name参数在第二个构造函数中不可变时: 我有以下编译时错误: 不允许在辅助构造函数参数上使用Kotlin:“val” 有人能解释为什么Kotlin编译器不允许这样做吗?