专栏首页sickworm1. hello world!与函数声明

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 12. Kotlin 作用域函数(scope function)

    学习 Kotlin 一定绕不开 run/let/apply/also 这四兄弟,它们是 Kotlin 使用频率最高的扩展方法(扩展方法在之前文章有介绍),它们也...

    sickworm
  • 6.变量声明与基本类型(Primitive Type)

    本文将会介绍 Java 的基本类型和 Kotlin 的区别。我们知道,Java 的基本类型是 boolean, char, short, int, long, ...

    sickworm
  • 5. 函数声明与闭包(Closure)

    今天介绍闭包。闭包也不是新东西了。其实 Kotlin 就基本没有新东西,不,是新语言都基本没有新东西。新语言都是把近些年好用的特性组装起来,再加点自己的见解,因...

    sickworm
  • Eclipse Kepler 4.3 正式版发布

    摘要:代号为Kepler的Eclipse 4.3正式版的下载已经出现在Eclipse官方的首页上,该版本支持开发Java EE 7应用、提供完整的商业过程管理B...

    阳光岛主
  • Kotlin入门(9)函数的基本用法

    上一篇文章介绍了Kotlin新增的空安全机制,控制语句部分可算是讲完了,接下来将连续描述Kotlin如何定义和调用函数,本篇文...

    用户4464237
  • 注册中心 Eureka 源码解析 —— 应用实例注册发现(一)之注册

    芋道源码
  • Linux下安装和配置Git

    如果要在 Linux 上安装预编译好的 Git 二进制安装包,可以直接用系统提供的包管理工具。在 Fedora 上用 yum 安装:

    杨肆月
  • 【续】Java面试基础必备知识点,怼死面试官,从我做起

    输入标题 小海哥的封面越骚,内容越有味的更新,马上接近尾声了,还有一个数据库更新,外加jvm深度解析,hashMap源码必读,最后放几篇大厂的 ...

    用户1257393
  • WinForm程序启动控制台窗口Console

    本文转载:http://blog.csdn.net/oyi319/article/details/5753311

    跟着阿笨一起玩NET
  • Gartner中APM模型的优先级

    前一段时间对APM的知识点做了一些梳理,对APM的基本概念也做了梳理,对于这个由Gartner提出的东西,在具体的应用落地场景上还是不免有很多不理解的地方。很多...

    黑光技术

扫码关注云+社区

领取腾讯云代金券