最近,我开始学习kotlin
,并琢磨出main()
函数可能是这样没有参数编写的:
fun main() {
dayOfWeek()
}
这是怎么可能的,以及kotlin
在引擎盖下正在做什么?java
不允许我们这样做。
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版本。
菜单>工具>Kotlin>显示Kotlin字节码
反编译
按钮您可以从这里找到带有截图的简单指南
当重写超类的方法时,Java 允许返回类型是协变的。 为什么在覆盖方法时不允许相反的逆变参数类型?
问题内容: 我刚接触PHP,但是多年来我一直在使用类似的语言进行编程。我被以下内容弄糊涂了: 它产生了语法错误:这就是调用。 但这很好用: 碰了一会儿之后,我被告知您不能在默认属性中调用函数。你必须在做。我的问题是:为什么?这是“功能”还是草率的实现?有什么根据? 问题答案: 编译器代码建议这是设计使然,尽管我不知道其背后的官方原因是什么。我也不确定要可靠地实现此功能需要花费多少精力,但是目前完成
问题内容: 来自C语言的Go语言最值得注意的方面之一是,如果在其中声明了一个未使用的变量,编译器将不会编译您的程序。那么,如果在函数中声明了一个未使用的参数,那么为什么要构建此程序呢? 问题答案: 没有正式的原因,但是在golang-nuts上给出的原因是: 未使用的变量始终是编程错误,而编写不使用其所有参数的函数是很常见的。 可以将这些参数保留为未命名(使用_),但这可能会与诸如 func fo
我们有一个员工姓名表,其中列有ID、name、salary 查询1不起作用,但查询2起作用。从我的开发经验来看,我觉得对此可能的解释是: sum()处理参数中指定的一组值。这里传递了'salary'列,因此它必须将此列的所有值相加。但是在where子句中,记录是一个接一个地检查的,就像第一条记录1是为了测试而检查的,等等。因此,不会计算sum(工资),因为它需要访问所有列的值,然后只有它返回一个值
我有以下课程: 但当我想让name参数在第二个构造函数中不可变时: 我有以下编译时错误: 不允许在辅助构造函数参数上使用Kotlin:“val” 有人能解释为什么Kotlin编译器不允许这样做吗?