☰
零基础学Kotlin:从Hello World到函数式编程的入门路线
2026/10/24 6:12:59 网站建设 项目流程

简介:《Atomic Kotlin》是由两位作者 Bruce Eckel 与 Svetlana Isakova 合著的 Kotlin 英文原版电子书,定位为从零起步、逐步深入的 Kotlin 入门读物,适合完全没有编程经验的新手、日常使用 Android 的开发者,以及希望转向 JVM 或跨平台开发场景的程序员。全书按知识点组织,前半部分依次讲解可变与不可变变量、基本数据类型、函数、if 表达式、字符串模板、数值类型与布尔类型、while/for 循环、范围与 in 关键字、表达式与语句等编程基础;后半部分进入对象、创建类、属性、构造器、可见性、包、测试、异常、列表等主题,并延伸至高阶函数、lambda 表达式与协程等高级特性。整体目录结构清晰,章节相对独立,便于按知识点跳读、回看和动手验证。压缩包内提供 1 个 PDF 文件,大小约 2.79MB,即完整英文正文,可导入阅读器或按需打印。目前已有 351 人学习下载,适合系统跟学与查缺补漏,也适合配合短小示例反复运行,理解 Kotlin 在服务端、Android 等典型场景中的实际用法。

1. 零基础学Kotlin:这本书为什么能当第一本

很多人听到"编程语言"四个字,第一反应是"这玩意儿是不是只有程序员才学得会?"我刚开始学的时候也一样,打开教程看到满屏的public static void main,瞬间就合上了页面。直到遇到《Atomic Kotlin》,才明白原来入门书可以这么轻松:它把每个知识点拆成最小单位,一次只讲透一个概念,像搭积木一样,让你在"哦,原来如此"的反馈中一路走下去。这本书是写给Kotlin零基础新手的,尤其适合两类人:完全没写过代码的小白,以及想从其他语言转到Kotlin的初学者。它能解决的问题很直接——别怕,Kotlin没那么难,跟着一个例子一个例子敲就好。

2. 先搞懂一个问题:Kotlin到底是什么,能做什么

2.1 用大白话讲清楚Kotlin:简洁的现代编程语言

Kotlin是一门相对年轻的编程语言,正式发布于2016年,设计初衷是为了改善Java开发中那些啰嗦和容易出错的地方。很多新手会问:为什么要出一门新语言?Java不好吗?Java当然好,它稳定、生态大,但写起来确实不够简洁。Kotlin的目标就是"让日常开发写得更少、错得更少"。

我们拿一个最典型的例子说:定义一个只有两个字段的类。在Kotlin里可以这样写:

data class User(val name: String, val age: Int)

就这么一行,就完成了"定义一个User类,包含name和age两个属性,并且自带equals、hashCode、toString等方法"。如果用Java写,你需要建文件、写私有属性、写构造函数、写getter和setter,还要写toString,随随便便就是几十行。新手看到这种差距,一般很快就能理解"为什么说Kotlin简洁"。

除了简洁,Kotlin还在"安全"上下了功夫。空指针(NullPointerException)是Java程序员最头疼的运行时错误之一,Kotlin从类型系统上把"值可能为空"和"值一定不为空"分开,迫使你在写代码时就想清楚空值的情况,很多潜在崩溃在编译阶段就被拦下来了。

Kotlin还有一项很舒服的特性叫"类型推断"。很多时候你不需要写类型,编译器能根据等号右边的内容自动猜出来。比如:

val message = "Hello" val count = 42

第一行会被推断为String类型,第二行会被推断为Int类型。这大大减少了代码里的冗余信息,也让新手写得轻松。但要注意,推断不是"不管类型",而是让编译器替你管理类型,你依然要遵守类型规则。

2.2 它和Java的关系:不是对手,而是队友

很多教程在介绍Kotlin时会拿它和Java做对比,有的甚至说Kotlin要取代Java。这种说法容易让新手误会。真实情况是,Kotlin和Java是"互相协作"的关系,而且大部分时候,它们同属一个项目。

Kotlin编译后的字节码和Java一样,都是给Java虚拟机(JVM)运行的。所以Kotlin代码里可以直接调用Java写好的库,比如文件操作、集合框架、日期处理等。反过来,Java代码里也可以调用Kotlin写的类。在同一个项目里,你完全可以同时有.java文件和.kt文件,它们互相调用,编译到一起。

对新手来说,这有什么实际意义?意义在于:你不需要为了学Kotlin先把Java完整学一遍,但你可以利用Java已经积累的无数现成库。举个例子,你想在程序里获取当前日期,直接用Java的日期类就行:

import java.time.LocalDate fun main() { val today = LocalDate.now() println("今天的日期是 $today") }

在这个例子里,LocalDate是Java类库提供的日期类,Kotlin可以直接import并使用,不需要额外安装任何东西。这就是"站在巨人肩膀上"的体验。

同时,了解这种关系还能帮你消除一个担忧:学Kotlin会不会白学?不会。即便以后你接触Java项目,也能很快上手,因为语法结构有相似之处。所以《Atomic Kotlin》的附录里专门安排了Java互操作性的内容,目的就是让你在学完基础后,能顺利接入更大的技术生态。

2.3 学会Kotlin能干什么:App、服务端、多平台

我们把应用场景说具体一点,你才清楚投资时间值不值。

第一个场景是Android开发。这是Kotlin目前最主流的用途。现在新开的Android项目,几乎默认用Kotlin。如果你想去做自己的App,Kotlin几乎是绕不开的第一步。很多招聘Android开发工程师的岗位,要求里都写着"熟悉Kotlin"。

第二个场景是服务端开发。Kotlin可以写后端接口、处理业务逻辑,很多团队为了减少代码量,把后端的Java代码改成Kotlin。如果你将来想写网站后端,Kotlin也能胜任。

第三个场景是多平台。Kotlin可以把同一套代码编译成不同平台运行,比如共享业务逻辑给Android和iOS。虽然这个功能偏进阶,但它意味着Kotlin的"技能半径"还在扩大。

下面这个表格帮你快速对号入座:

你的目标学Kotlin的作用
想做Android App核心语言,必须学
想写后端接口很好用的替代语言,语法简洁
想学好一门现代语言Kotlin风格优雅,适合入门

需要明确的是,这本书本身不教Android,它教你的是Kotlin语言本身。但有了语言基础,后面学Android会顺畅很多,因为你只需要再了解Android的组件,不需要同时被语法和新概念夹击。

3. 动手前先准备:环境搭建和两个核心概念

3.1 环境不用一步到位:在线运行和本地安装两条路

新手学编程,最怕卡在第一步:装环境。什么JDK、SDK、PATH,每个词都像一个黑匣子,装不好就寸步难行。我第一次学的时候,参考了一篇教程,下载了一堆软件,结果版本不匹配,忙活了一晚上,控制台还是提示"找不到命令",那种挫败感差点劝退我。后来我学聪明了:先别追求本地环境,用更轻的方式跑起来,有需要再装两件套。

方式一:在线运行。打开浏览器,搜索"Kotlin在线运行"或"Kotlin playground",随便挑一个可以编辑和运行代码的网页,左边输入代码,右边就能显示结果。这种方式零安装、零配置,适合马上想验证一个语法的读者。坏处是不能保存太多文件,运行复杂项目也不现实,但入门初期完全够用。

方式二:本地安装。如果你确定要长期学,甚至打算以后做开发,那么本地环境还是值得配的。你需要两样东西:

第一样:JDK,中文叫Java开发工具包。Kotlin编译和运行都依赖它,可以理解为Kotlin的"底座"。去网上搜"JDK download",选一个较新的稳定版本下载,安装即可。如果你用的是Windows,安装时建议把路径记住,后面排错用得上。

第二样:编辑器。写代码当然可以用记事本,但好的编辑器能帮你检查语法、自动补全,新手幸福感高很多。推荐下载IDEA社区版,它是免费的,对Kotlin支持非常完善。安装之后,新建一个项目,选择"Kotlin JVM",等它同步完成,就能开始写第一个文件了。

提示:第一次装环境,建议给自己留出至少一小时。90%的问题都出在"版本不匹配"和"路径没配置对"两件事上,遇到问题不要慌,上网搜具体的报错文字,通常能搜到答案。

无论你选哪条路,都要注意版本匹配。比如你下载了最新的JDK,但IDE版本较旧,可能不兼容。一般建议下载长期支持版,而不是最新的预览版。

3.2 先认识两个高频词:变量与函数

在敲第一个完整例子之前,我们先认识Kotlin里两个最低层的东西:变量和函数。你之后写的每一行代码,几乎都离不开它们。

变量,通俗地讲,就是"给数据贴标签"。比如你想记住一本书的名字,就可以用一个变量来装:

val bookName = "Atomic Kotlin"

这个val是Kotlin里很常见的声明方式,表示"只读变量"。bookName是变量名,=右边是它装的数据。只读的意思是这个变量一旦被赋值,就不能再指向别的数据。如果在后面写bookName = "Other",编译器会报错。为什么要这么设计?因为"只读"可以让代码更不容易出错——你不用担心某个值在别的地方被偷偷改掉。

与之对应的还有var,表示"可变变量":

var page = 100 page = 120 // 可以重新赋值

如果你确定一个数据后面可能要变,就用var;如果它从头到尾不变,优先用val。这个选择习惯值得养成。

函数,就是一段可以被反复调用的代码块。它让你不用每次重复写同样的逻辑。比如:

fun add(a: Int, b: Int): Int { return a + b }

fun是函数的关键字;add是函数名;括号里的a: Int, b: Int是参数,分别表示两个整数;冒号后面的Int表示返回值类型是整数;return a + b表示返回它们的和。定义好之后,你想算3和5的和,直接写add(3, 5),它就会返回8。函数的好处是,下次想算任何两个数的和,只要调用它就行,不用重新写加法逻辑。

我们也可以把变量和函数串成一个完整的小程序:

fun main() { val book = "Atomic Kotlin" val year = 2020 println("$book 是一本面向初学者的书,出版于 $year 年。") }

运行后,控制台会输出对应的句子。这里year虽然是数字,但在字符串模板里会自动变成文本。这就是变量和函数结合的最早例子。你现在可以试着改改year的值,看看输出有什么变化。

3.3 这本书的目录怎么读:七个部分是一条学习路线

《Atomic Kotlin》的目录很有特色,它不是把语法条目硬排,而是按"从会用到灵活用"的路线设计的。全书分七个大部分,我帮你把它们翻译成人话:

第一部分是"编程基础",包括变量、数据类型、函数、if、循环、字符串模板,这些是所有语言都有的"通用词"。 第二部分是"对象入门",讲类、属性、构造函数、列表和集合,让你开始接触"把数据和操作包在一起"的思想。 第三部分是"可用性",包括扩展函数、when、枚举、数据类、空安全,这部分你会学到很多Kotlin特有的便利功能。 第四部分是"函数式编程",讲lambda、高阶函数、集合操作、序列,这是Kotlin最精华的部分,代码会变得更优雅。 第五部分是"面向对象进阶",包含接口、继承、多态、密封类、伴生对象,适合你想深入设计大型程序时读。 第六部分是"防止失败",讲异常处理、单元测试、日志,这些是让程序在真实环境里更稳的工具。 第七部分是"高级工具",包括作用域函数、运算符重载、属性委托、懒加载等,属于加分技巧。

你可以把这本书当成七层关卡,一关一关过。尤其要注意每关末尾的"Summary"部分,它把本章重点浓缩成一个个小练习,我建议你合上书亲自完成,而不是只看答案。

读目录时,你会注意到几个英文小节名,比如"String Templates"、"Nullable Types"、"Scope Functions"。这些看起来高深,其实都是一个个具体的小主题。书里每个主题通常配一个"原子"级的小示例,这也是书名的由来——把复杂的知识拆成原子,再一个个组装起来。所以你不必担心目录厚,它其实是很多个"小台阶"。

4. 跟着书跑通第一个例子:Hello, World! 逐行拆解

4.1 创建文件并敲入第一段代码

无论你用在线运行还是本地IDEA,第一步都是创建一个Kotlin文件。先打开IDEA,新建一个项目,然后在项目里右键新建文件,文件名叫Hello.kt。这里扩展名一定要写对,这决定了IDE能不能识别出它是Kotlin代码。

创建完成后,把下面这段代码敲进去。不要复制粘贴,我建议让新手自己敲,因为敲一遍能帮你记住结构。

fun main() { println("Hello, World!") }

如果有人觉得太简单,先别急,这个例子的价值不在于功能,而在于让你看到:一个完整的Kotlin程序是什么形状,哪里是入口,哪里是动作。下面的小节我们把它拆开了揉碎了讲。

4.2 逐行拆解:fun、main、println分别是什么

第一行是fun main() {。这里fun是Kotlin用来声明函数的关键词,看到它,你就知道"哦,这里要定义一个函数了"。紧接着的main是函数名,这个函数名不是随便起的,它是程序执行的起点。当程序启动时,运行环境会去找一个叫做main的函数,并从它的第一行开始执行。所以每个可独立运行的程序,都得有一个main函数。

main后面的小括号是放参数的位置。目前是空的,表示这个函数不需要额外的输入。如果以后你想在命令行启动程序时传一些参数,就可以在这里写args: Array<String>,表示接收一个字符串数组。不过初学者先不用管,知道有这么回事就行。

第一行末尾的{表示"函数体从这里开始"。函数体就是函数真正要做的事情,要用左右花括号{和}圈起来。从这里开始,一直到对应的右花括号},都属于main函数的内容。

第二行是println("Hello, World!")。println翻译过来就是"print line",意思是在控制台打印一行内容,然后换行。括号里的"Hello, World!"叫做字符串,是我们要打印的内容。字符串必须用英文双引号包起来,这是Kotlin的语法规定。整行末尾的分号可写可不写,Kotlin不像Java那样强制要求分号。如果你从Java转过来,可以慢慢去掉写分号的习惯。

第三行单独的}是函数体的结束标记。也就是说,整个函数做的事情就是:打印一行"Hello, World!",然后程序结束。

让我们再做一个简单实验,把第二行改成使用变量和字符串模板:

fun main() { val bookName = "Kotlin" println("你好,$bookName") }

这里$bookName会把变量值插入字符串。运行后控制台会显示"你好,Kotlin"。这就是我们前面介绍过的字符串模板,现在你应该能理解$的作用了。

4.3 运行结果与新手常见报错排查

在IDEA里,运行这个程序很简单:在main函数左侧的代码区,有一个绿色的三角形按钮,点击它,或者右键选择"Run 'HelloKt'",底部会弹出控制台面板,里面显示Hello, World!。

提示:如果你用的是在线运行环境,根本不需要命令行,直接点击"运行"按钮即可。

如果你用的是命令行工具,流程是这样:

kotlinc Hello.kt -include-runtime -d Hello.jar java -jar Hello.jar

第一条命令是"编译",意思是把你写的人类代码翻译成机器能理解的字节码,并打包成一个jar文件。-include-runtime参数表示把Kotlin运行需要的基础库一起打包,这样这个jar就能独立运行,不需要依赖外部文件;-d Hello.jar是"destination"的缩写,指定输出文件名。第二条命令是"运行",用Java虚拟机去加载并执行这个jar包。

新人最常遇到这样几个问题:

问题1:kotlinc: command not found。这说明系统找不到kotlinc命令。大概率是Kotlin编译器没有安装,或者安装后没有把它的路径加入系统环境变量。解决:确认安装目录,找到包含kotlinc这个可执行文件的文件夹,然后把它加入PATH。具体配置方法不同系统不一样,你可以直接搜索"macOS配置kotlinc环境变量"或"Windows配置kotlinc路径"。

问题2:Error: Could not find or load main class HelloKt。这通常是运行命令写错了,或者jar包路径不对。检查你的文件名和命令里的Hello.jar是否一致。

问题3:代码里出现了红字,但你的文件名也正确。这往往是下载的项目类型不对,没有引入Kotlin支持。此时检查IDEA项目结构里是否存在Kotlin配置,必要时重新用"新建Kotlin项目"的方式创建项目。

把这些坑提前排掉,你后面学起来会顺畅很多。我第一次配置时,光处理环境变量就花了一个晚上,真想过去给当时的自己提个醒。

5. 避坑指南:新手最容易踩的5个常见问题与排查

学Kotlin的过程里,有些坑几乎每个新手都会踩。我自己踩过,也见过周围很多人踩。把这些坑提前说出来,不是想让你背,而是让你在遇到报错时能想起"哦,原来是这回事"。下面按出现频率从高到低排了序,前四个都是编译器或运行时能告诉你的问题,最后一个是学习习惯问题,但比前四个更致命。

5.1 val和var分不清:程序不让我改值

现象:你写val name = "Kotlin",然后下一行想改成name = "Java",编译器立刻变红,提示Val cannot be reassigned,也就是"val不能被重新赋值"。你可能会疑惑:我自己的变量,我自己的代码,为什么不让改?

原因:因为在Kotlin里,val代表"只读引用"。它是在声明时就定死的,之后不能再指向别的内容。这个设计是为了减少代码中"悄悄变化"带来的意外。如果你希望在运行时修改这个变量,说明一开始就应该用var。

解决:先看用途。如果这个变量代表的东西后续会被替换,比如循环计数器、累加器、临时结果,就声明为var。如果它代表一个固定的配置、一个唯一的名字,尽量用val。我的建议是:声明时先用val,让编译器帮你判断,如果报错再改成var。这样你会逐渐养成"默认不可变"的好习惯,写出来的代码也更稳。这本书"var & val"一节也明确强调了"val优先于var"的建议。

5.2 字符串模板忘写$:输出和想象不一样

现象:你想把变量language的值插到字符串里,写了println("我在学习 language"),运行后屏幕上的确打了"我在学习 language",但那个"language"就原样印在那里,没有变成变量值。你可能盯着代码看半天,觉得没毛病啊。

原因:Kotlin的字符串模板是靠$符号"激活"的。只有$language才会去读取变量language的值;没有$,它就是普通文本。很多新手容易把Kotlin当成自己熟悉的模板来写,忘了Kotlin的规则。

解决:记住两个写法。简单的变量插入:$变量名。需要计算或调用方法:${表达式}。举个例子:

val a = 5 val b = 3 println("a的值是 $a,a加b等于 ${a + b},b是否大于a?${b > a}")

输出会是:a的值是 5,a加b等于 8,b是否大于a?false。你看,$a直接取变量,${a + b}做了一次加法,${b > a}做了一次比较。掌握这两个写法,字符串模板就过关了。

5.3 类型不匹配:把字符串塞给了整数

现象:你写val age: Int = "20",编译器给你一句Type mismatch(类型不匹配),意思是等号两边对不上。你可能想"20不就是一个数字吗?"但在Kotlin看来,带引号的"20"是一串文本,和数字20完全是两种东西。

原因:Kotlin是强类型语言,它要求变量类型必须稳定。声明了Int的位置,只能放整数值;字符串属于String,两者之间不会自动转换。这跟Python或JavaScript那种"自动变通"的语言不一样。

解决:要么把声明类型改掉,比如val age: String = "20";要么真的需要一个整数,就做显式转换:val age: Int = "20".toInt()。Kotlin为数值类型准备了一堆转换方法,比如toInt()、toDouble()、toLong(),你可以在书里的"Number Types"小节找到它们。当你下次看到"Type mismatch"时,不要慌张,停下来想想:这两个到底是什么类型?你要不要转换?这个思考习惯会让你快速成长。

5.4 可空类型没处理:运行起来才崩溃

现象:代码编译通过,运行到某一行,程序突然中断,控制台冒出一句NullPointerException。你明明检查过代码,没有明显问题,但程序就在那里崩了。

原因:Kotlin里,一个类型可以标记为"可空",比如String?,表示这个变量说不定是null(空值)。如果你把一个可空类型的值直接当成普通值用,编译器可能会提示警告,但在某些场景下编译器管不到,运行时就炸了。很多Java转过来的同学特别容易掉进这个坑,因为Java里所有变量都可能为空,写法上没有区分。

解决:看到类型后面带?时,就要有"它可能是空"的意识。要安全访问,用?.:比如name?.length,只有name不为空时才取length,否则结果为null。要给出兜底,用Elvis操作符?::val len = name?.length ?: 0,意思是"如果左边是null,就用右边的0"。空安全的三个工具?.、?:、!!,建议按顺序使用:优先?.,其次?:,最后才考虑!!。除非你非常确定非空,否则不要用!!强行断言,那是把崩溃风险留给自己。书里"Safe Calls & the Elvis Operator"这一节建议多读两遍。

5.5 只看书不敲代码:眼睛会了手不会

现象:把一章从头看到尾,每个例子都"看懂了",感觉状态特别好,可合上书,让自己写一个等价的程序,却半天憋不出来。这太常见了。

原因:编程不是知识,而是技能。知识靠记忆,技能靠肌肉记忆。就像你看别人骑自行车,觉得自己明白了,但真上车还是会倒。代码也是一样,大脑"以为懂"和手指"能写出来"之间,隔着一百次敲击练习。

解决:把书里的所有代码示例当成"字帖",先抄,再脱稿,最后改。每学一节,至少亲手敲三个例子,并改动里面的参数或逻辑,观察输出有什么变化。做完这些,再合上书,试着把这个章节的核心知识点默写出来。你会发现,这个过程比单纯阅读慢不少,但效果扎实得多。我不只一次见过有人靠"看"学了几个月,结果真上手时连一个main函数都写不完整,这就是没动手的后遗症。每天再忙,也至少敲十个例子,不求和课程一样,但求和手熟。所谓"手感",就是看到一道题,手指自然能写出结构。

6. 下一步怎么学:把《Atomic Kotlin》读成自己的功力

学完Hello, World之后,不要急着往后冲。我建议你给自己定一个节奏:每天读一小节,把该节代码敲一遍,然后完成节末的练习。书里有很多小结(Summary),它们不是复习这么简单,而是给你"合上书默写"用的。你可以把每个小结当成一次小测验:先不看书,试着写出这章讲过的几个重点代码,再对照检查。这样做一次,比你读三遍都有效。

一个比较可行的顺序是:先学完第一、二部分,掌握基础语法和对象概念;然后花时间啃第四部分"函数式编程",这是Kotlin最与众不同之处;之后再回到第五部分深入面向对象;最后用第六、七部分来加固和升级。中间遇到卡住的地方,不用死磕太久,先跳过,很多问题学到后面会自然解开。

学完全书后,你可以挑战一个完整小项目,比如写一个命令行记账工具,或者一个批量重命名图片的脚本,都能帮你把知识串起来。之后如果对Android感兴趣,就去看Android开发的基础内容;如果想走服务端,可以学流行的Web框架。Kotlin的生态很大,但功法的基础就是这本书里这些"原子"层面的东西。

另外我还想提醒一点:不要囤积资料。买了很多书、收藏很多文章,但一个都不打开,反而会有"我怎么都懂但不熟"的错觉。我是从收藏党过来的,后来强制自己一本书反复刷三遍,第三遍再读时,很多当初没注意的细节才真正浮现。从那以后,我每次拿到新资料都先定一个"最小行动清单":今天哪一节、敲哪段代码、改哪一行,强制自己走完一遍再谈收获。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询