1. hello world!与函数声明

首先我们看 Java 的 hello world:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

非常熟悉。可在我漫长的编程生涯中,我大概是第 5 次在 Google 搜索了“Java Hello world”之后,才能独自完整的默写出来。。因为他有些“不太好记住”的点:比如他必须通过该类的一个叫 main 的 public 的 static 的函数,且这个函数入参必须是有且仅有一个 String[] 数组。如果错了其中一个,那你就没法运行。

这是 Kotlin 版本:

fun main() {
    println("Hello world!")
}

写起来还蛮快乐的,是吧?没有太多多余的东西,很简洁。但大家可能也会有很多疑问。那我们一起来看:

  • Kotlin 的 Hello world 没有声明类。这很不 Java!要知道 Kotlin 或者其他基于 JVM 的语言无论怎么设计,他最终也是要在 JVM 上跑的,而 JVM 恰好就是一套基于类来设计的运行机制,和 Java 的思想是一致的。你 Kotlin 现在自己搞一套,连类都没有了,怎么在 JVM 上跑?

这其实是 Kotlin 编译器的功劳。这点很重要,以后你遇到 Kotlin 的新特性,和 Java 对不上的时候,就回想这点:都是 Kotlin 编译器的功劳,他把 Kotlin 代码转换成了符合 Java 思想的 JVM 字节码。小本本记好啦,这句话将贯穿整个 Kotlin 学习。

如果你用过 jadx的话,可以反编译试试。这里的结论就是:HelloWorld.kt 会被编译为一个叫 HelloWorkKt 的类,把这段代码塞进去。当然你再去创建一个 HelloWorldKt 的类就会报错了,你可以试试 🙂

  • 没有分号。古时候,一行完整的代码用分号来分隔。后来大家觉得分号已经没有必要了,也基本没有人会在一行写几行代码了。新的语言一部分是柔和派,分号变为可选;另一部分激进派直接去掉了分号。Kotlin 属于前者,如果你写一个分号,IDE 爸爸会告诉你,没得必要,但不会报错。如果你故意把两行代码写成一行,中间加一个分号,这个分号就是必要的。

  • 函数的声明通过 fun 关键字。欸?Java 不需要关键字来声明函数呀。以 JavaScript 为首的语言认为,函数是一等公民,应当做一个对象看待。这样函数就可以被持有,被传递,提高他的灵活性。所以像 JavaScript 这样的语言,方法声明会有关键字,否则你就不知道自己到底是在调用一个函数,还是在执行一个变量持有的函数了。

Kotlin 也支持函数是一等公民,所以函数声明需要关键字。Java 其实也有类似的东西,他叫匿名类。只不过匿名类需要声明一个类,再用匿名类的特殊写法去创建一个看起来像函数对象的东西。

  • 函数属性默认是 public。 Java 默认是用的很少的 package private。
  • 函数默认返回值是 Unit。 Java 没有默认返回值,需要显式声明为 void。为啥 Kotlin 不用 void 呢?因为声明返回值为 Unit 可以让一切对象化,在某些场景可以简化代码编写。举一个简单的情况,你可以写 return println("Hello world!"),而不再需要写成两行了。

  • **println 代替了 System.out.println **。学 Java 的时候大家应该都吐槽过,写个打印好废键盘啊!这是因为 Java 严格按照对象调用的规则办事,方法必须是属于类的,除非你在类里面调同一个类里的办法,可以省略this.,其他地方都需要加对象才能调用一个方法(类也是对象嘛)。

所以 Kotlin 是怎么做到不用指定对象也能调用方法呢?是有顶层声明(top-level declaration)的特性。就像第一点提到的那样,Kotlin 编译器会通过各种各样的方法把顶层声明的函数编译成对象方法调用的形式。顶层声明还有更多酷炫的能力,比如给任意一个类“增加方法”,后面我们会展开来讲。

以上就是 Kotlin 的 Hello world 涉及到的几个知识点。是不是觉得要写个 Hello world 也要懂这么多很费劲呢?其实要弄懂 Java 的 Hello world 也很费劲的,只是你已经过去那个初学的阶段了。在 Java 的基础上理解 Kotlin 相对还是简单的,如果你有其他语言的开发经验那就更简单了,因为 Kotlin 的特性,基本都能在某个语言上找到,它本身并不是新特性的创造者,他只是好用特性的搬运工。

版权所有,转载请注明出处:
https://sickworm.com/?p=1768

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据