当前正在阅读
Kotlin程序设计基础
预计阅读时间: 2 小时
  知识库提供的所有文档均为本站版权所有,禁止任何未经授权的个人或企业发布、传播、售卖本站提供的文档,如经发现,本站有权起诉侵权方并追究法律责任。
image-20230725125851157

Kotlin程序设计初级篇

注意: 在开始学习之前,推荐各位小伙伴有一定的编程语言基础,前置课程:《JavaSE 教程》或《C 语言程序设计》如果没有其他语言的基础,在学习Kotlin时会非常吃力,这门语言语法糖多到爆炸。

Kotlin是一种现代但已经成熟的编程语言,旨在让开发人员更快乐。它简洁、安全、可与Java和其他语言互操作,并提供了许多在多个平台之间重用代码的方法。它由JetBrains公司于2011年设计和开发,并在2016年正式发布。Kotlin旨在解决Java语言在编码效率和代码质量方面存在的问题,并且与Java语言完全兼容。Kotlin通过简化语法、提供更强大的功能以及减少样板代码的编写,使得开发者能够更高效地编写清晰、简洁而又安全的代码。

Kotlin语言名字的来源是基于一个古老斯拉夫部落的名字。JetBrains开发Kotlin的初衷是为了在Android开发上取代Java,并且作为一门通用的编程语言。Kotlin通过减少样板代码和增加现代化的语言特性,提供了更好的工具和库来简化Android应用开发。由于Kotlin的设计理念和特性吸引了广泛的开发者关注,它也迅速被接受并得到了广泛的使用。现在,Kotlin已成为一门流行的编程语言,被许多开发者用于Android应用开发、服务器端开发以及其他领域的软件开发中。

官方网站:https://www.jetbrains.com/opensource/kotlin/

image-20231215224847189

Kotlin 是一种现代化的静态类型编程语言,具有以下优势:

  1. 与Java互操作性强:Kotlin 可以与现有的 Java 代码无缝地互操作,允许开发者在现有的项目中逐步采用 Kotlin,而不需要重写整个项目。这使得 Kotlin 成为 Android 应用开发的理想选择。
  2. 简洁易读:Kotlin 的语法简洁并具有更好的可读性,减少了样板代码的编写。相比 Java,Kotlin 可以使用更少的代码来实现同样的功能,从而提高开发效率。
  3. 空安全性:Kotlin 对空值进行了更好的处理。在 Kotlin 中,变量默认是非空的,如果需要使用可能为空的值,需要显式声明类型为可空。这有助于减少空指针异常的发生。
  4. 函数式编程支持:Kotlin 支持函数式编程的特性,如高阶函数、lambda 表达式和函数式编程的集合操作等。这些特性可以让开发者编写更简洁、可维护的代码,并提高代码的表达能力。
  5. 扩展函数:Kotlin 允许开发者为某个类添加新的方法,而不需要修改该类的源代码。这种扩展函数的特性可以为开发者提供更灵活的方式来扩展现有的类库。
  6. 协程支持:Kotlin 引入了协程(coroutine)机制,使得异步操作更易于管理和编写。通过使用协程,开发者可以使用顺序的方式编写并发代码,并避免了回调地狱的问题。

总的来说,Kotlin 是一门功能丰富、可读性高、与 Java 无缝互操作的编程语言,适用于 Android、Web 后端开发等多种场景。

image-20230725132203050

正是因为Kotlin与Java的高度兼容性,再加上简洁、安全、互操作性强等特点,让Kotlin一度成为Android开发的官方指定语言。并且随着时代的发展,现在它不仅仅可以开发安卓应用程序,也可以开发iOS程序,甚至开发Java后端、开发桌面应用程序等。其简洁高效的语法也受到一众开发者追捧。

从下节课开始,我们就来正式学习一下Kotlin语言,Kotlin,启动!

image-20230725135856171

走进新语言

欢迎大家进入到Kotlin程序设计的学习中,我们将从开发环境配置开始,为各位小伙伴讲解。

编程语言可以被视为人与计算机之间进行交流的方式。它是一种用于编写计算机程序的形式化语言,用于描述计算机任务的操作步骤、算法和数据结构。简单来说,就是以计算机能听懂的语言告诉计算机我们要做什么,然后让计算机来做我们想做的事情,从而解决我们生活中各种各样的问题。

编程语言可以分为多种类型,包括低级语言和高级语言。低级语言(如汇编语言)与计算机硬件更接近,对计算机底层操作进行更精细的控制,但编写和理解起来较为复杂。高级语言(如Java、Python等)则更加易读、易写,并提供了更高层次的抽象,使得程序员能够更专注于问题的解决和算法的设计。而我们这里要学习的Kotlin语言,也属于高级语言的一种,能够使用我们人类更容易理解的语法来编写程序。

开发环境配置

要开发Kotlin程序,我们首先需要安装Java环境,我们一般使用Kotlin都是在JVM平台上进行开发(Kotlin同样可以开发系统原生程序、JavaScript程序、安卓程序、iOS程序等)因为Java支持跨平台,能在编译后再任意平台上运行,因此,我们将JVM环境中学习Kotlin程序的开发,接下来我们要安装两个环境:

  • Java 8 环境
  • Kotlin 1.9.0 环境

首先我们来安装Java 8 环境,这里我们需要去下载JDK,这里推荐安装免费的ZuluJDK:https://www.azul.com/downloads/?version=java-8-lts&package=jdk

在这里选择自己的操作系统对应的安装包:

image-20220916155142546

比如Windows下,我们就选择.msi的安装包即可(MacOS、Linux下同样选择对应的即可)

image-20220916155242814

下载完成后,我们直接双击安装:

image-20220916160027645

**注意,这里不建议各位小伙伴去修改安装的位置!**新手只建议安装到默认位置(不要总担心C盘不够,该装的还是要装,尤其是这种环境,实在装不下就去将其他磁盘的空间分到C盘一部分)如果是因为没有安装到默认位置出现了任何问题,你要是找不到大佬问的话,又得重新来一遍,就很麻烦。

剩下的我们只需要一路点击Next即可,安装完成之后,我们打开CMD命令窗口(MacOS下直接打开“终端”)来验证一下(要打开CMD命令窗口,Windows11可以直接在下面的搜索框搜索cmd即可,或者直接在文件资源管理器路径栏输入cmd也可以)

我们直接输入java命令即可:

image-20220916160756046

如果能够直接输出内容,说明环境已经安装成功了,正常情况下已经配置好了,我们不需要手动去配置什么环境变量,所以说安装好就别管了。

输入java -version可以查看当前安装的JDK版本:

image-20230728003717281

只要是1.8.0就没问题了,后面的小版本号可能你们会比我的还要新。

接着是Kotlin 1.9.0 环境,我们需要前往:https://github.com/JetBrains/kotlin/releases 下载最新的Kotlin编译器并进行安装:

image-20230728003925164

这里我们可以直接解压然后拖入到刚刚Java安装的同级目录下,我这里是 C:\Program Files 文件夹,也可以自定义位置,但是不推荐,因为很多小伙伴配环境直接配到自闭。

然后我们需要手动配置一下环境变量,打开系统环境变量配置:

image-20230728004205319

添加路径 C:\Program Files\kotlinc\bin 到Path环境变量下即可,然后我们依然打开CMD查看是否安装成功,输入kotlinc -version来查看安装情况:

image-20230728004657590

这样我们就完成了所有环境的安装,我们可以来体验一下编写并且编译运行一个简单的Kotlin程序,我们新建一个文本文档,命名为Main.txt(如果没有显示后缀名,需要在文件资源管理器中开启一下)然后用记事本打开,输入以下内容:

kotlin 复制代码
fun main() {
    println("Hello, World!")
}

现在看不懂代码没关系,直接用就行,我们后面会一点一点讲解的。

编辑好之后,保存退出,接着我们将文件的后缀名称修改为.kt这是Java源程序文件的后缀名称:

image-20230728004854748

此时我们打开CMD,注意要先进入到对应的路径下,比如我们现在的路径:

image-20220916161720722

我们使用cd命令先进入到这个目录下:

image-20220916161802753

要编译一个Kotlin程序,我们需要使用kotlinc命令来进行,将我们的程序编译为jar包,并包含Kotlin的运行时依赖:

sh 复制代码
kotlinc Main.kt -include-runtime -d Main.jar

执行后,可以看到目录下多出来了一个.jar文件,这是一个打包好的标准Java程序:

image-20230728005317422

接着我们就可以将其交给JVM运行了,我们直接使用java -jar命令即可:

image-20230728005354810

可以看到打印了一个 Hello World! 字样,这样我们的第一个Kotlin程序就成功运行了。

IDEA安装与使用

前面我们介绍了Kotlin开发环境的安装以及成功编译运行了我们的第一个Kotlin应用程序。

但是我们发现,如果我们以后都使用记事本来进行Kotlin程序开发的话,是不是效率太低了点?我们还要先编辑,然后要改后缀,还要敲命令来编译,有没有更加方便一点的写代码的工具呢?这里我们要介绍的是:IntelliJ IDEA(这里不推荐各位小伙伴使用Eclipse,因为操作上没有IDEA这么友好)

IDEA准确来说是一个集成开发环境(IDE),它集成了大量的开发工具,编写代码的错误检测、代码提示、一键完成编译运行等,非常方便。

下载地址:IntelliJ IDEA:JetBrains 功能强大、符合人体工程学的 Java IDE

image-20220916162544360

我们直接点击下载即可,注意要下载下面的社区版,不要下载到终极版了:

image-20230728010334215

这个软件本身是付费的,比较贵,而且最近还涨价了,不过这里我们直接下载面的社区版本就行了(JavaSE学习阶段不需要终极版,但是建议有条件的还是申请一个,功能更强大,体验更友好)

下载好之后,直接按照即可,这个不强制要求安装到C盘,自己随意,但是注意路径中不要出现中文!

image-20220916163329410

这里勾选一下创建桌面快捷方式就行:

image-20220916163401880

安装完成后,我们直接打开就可以了:

image-20230728011902631

此时界面是全英文,如果各位小伙伴看得惯,可以直接使用全英文的界面(使用英文界面可以认识更多的专业术语词汇,但是可能看起来没中文那么直观,而且IDEA本身功能就比较多,英语不好的小伙伴就很头疼)这里还是建议英语不好的小伙伴使用中文界面,要使用中文只需要安装中文插件即可:

image-20230728012014698

我们打开Plugins插件这一栏,然后直接在插件市场里面搜索Chinese,可以找到一个中文语言包的插件,我们直接Install安装即可,安装完成后点击重启,现在就是中文页面了:

image-20230728012045895

如果各位小伙伴不喜欢黑色主题,也可以修改为白色主题,只需要在自定义中进行修改即可,一共四种主题,我们还可以在下面的设置中开启新UI以及更换各种字体、字体大小等个性化内容。

如果你之前使用过其他IDE编写代码,这里还支持按键映射(采用其他IDE的快捷键方案)有需要的可以自己修改一下:

image-20220916164415447

接下来,我们来看看如何使用IDEA编写Kotlin程序,IDEA是以项目的形式对一个Java程序进行管理的,所以说我们直接创建一个新的项目,点击新建项目:

image-20220916164906998

此时来到创建页面:

image-20230728012243268
  • 名称: 你的Java项目的名称,随便起就行,尽量只带英文字母和数字,不要出现特殊字符和中文。
  • 位置: 项目的存放位置,可以自己根据情况修改,同样的,路径中不要出现中文。
  • 语言: IDEA支持编写其他语言的项目,但是这里我们直接选择Java就行了。
  • 构建系统: 在JavaSE阶段一律选择IntelliJ就行了,Maven我们会在JavaWeb之后进行讲解,Gradle会在安卓开发教程中介绍。
  • JDK: 就是我们之前安装好的JDK,如果是默认路径安装,这里会自动识别(所以说不要随便去改,不然这些地方就很麻烦)

当然,如果JDK这里没有自动识别到,那么就手动添加一下:

image-20220916165351016

没问题之后,我们直接创建项目:

image-20230728012604472

进入之后,可以看到已经自动帮助我们创建好了一个kt源文件,跟我们之前的例子是一样的。要编译运行我们的Kotlin程序,只需要直接点击左边的三角形(启动按钮)即可:

image-20230728012647988

点击之后,会在下方自动开始构建:

image-20230728012720838

完成之后,就可以在控制台看到输出的内容了:

image-20230728012737850

我们可以看到新增加了一个out目录,这里面就是刚刚编译好的.class文件,这种文件是Java的字节码文件,可以直接运行在JVM中:

image-20230728012808045

IDEA非常强大,即使是编译之后的字节码文件,也可以反编译回原代码的样子:

image-20230728012917915

如果我们想写一个新的Kotlin项目,可以退出当前项目重新创建:

image-20230728013013293

此时项目列表中就有我们刚刚创建的Java项目了:

image-20230728013031657

如果你还想探索IDEA的其他功能,可以点击欢迎页最下方的学习:

image-20230728013059958

会有一个专门的引导教程项目,来教你如何使用各项功能:

image-20230728013143382

熟悉了IDEA的使用之后,下节课我们就可以正式地开始学习Kotlin语言的语法了。

程序代码基本结构

还记得我们之前使用的示例代码吗?

kotlin 复制代码
fun main() {
    println("Hello World!")
}

这段代码要实现的功能很简单,就是将 Hello World 这段文本信息输出到控制台。

在编写代码时,注意需要区分大小写,Kotlin语言严格区分大小写,如果我们没有按照规则来编写,那么就会出现红色波浪线报错:

image-20230729013954179

只要源代码中存在报错的地方,就无法正常完成编译得到字节码文件,强行运行会提示构建失败:

image-20230729014133372

注意这里包括的花括号是成对出现的,并且一一对应。

所以说各位小伙伴在编写代码时一定要注意大小写。然后第二行,准确的说是最外层花括号内部就是:

kotlin 复制代码
fun main() {
  
}

可以看到外面使用花括号前添加了fun main(),这是我们整个程序的入口点,我们的Kotlin程序也是从这里开始从上往下执行的。而其中的println语句就是用于打印其括号中包裹的文本,我们可以看到这个文本信息使用了""进行囊括,否则会报错:

kotlin 复制代码
println("Hello World!")

这段代码的意思就是将双引号括起来的内容(字符串,我们会在后面进行讲解)输出(打印)到控制台上。

比如下面的代码,我们就可以实现先打印Hello World!,然后再打印 KFC vivo 50 到控制台:

kotlin 复制代码
fun main() {
    println("Hello World!")
    println("KFC vivo 50")
}

效果如下:

image-20230729014638513

注意我们上面编写的打印语句其实是函数的调用(后续会进行讲解)不能写到同一行中,否则编译器会认为是同一句代码,同样会导致编译不通过:

image-20230729014909257

如果实在要写到同一行,那么我们需要在上一句代码最后添加;来表示上一段的结束:

image-20230729015012657

再比如下面的代码:

image-20230729015512923

这里我们尝试在中途换行或是添加空格,因为没有添加分号,所以说编译器依然会认为是一行代码,因此编译不会出现错误,能够正常通过。当然,为了代码写得工整和规范,我们一般不会随意换行或是添加没必要的空格。注意随意换行和空格仅限于可分割区域,比如println本身是一个函数的完整名称,这就不能从中间直接断开,否则语义就完全不一样了。

程序注释编写

我们在编写代码时,可能有些时候需要标记一下这段代码表示什么意思:

image-20230729020246148

但是如果直接写上文字的话,会导致编译不通过,因为这段文字也会被认为是程序的一部分。

这种情况,我们就需要告诉编译器,这段文字是我们做的笔记,并不是程序的一部分,那么要怎么告诉编译器这不是代码呢?很简单,我们只需要在前面加上双斜杠就可以了:

image-20230729020334200

添加双斜杠之后(自动变成了灰色),后续的文本内容只要没有发生换行,那么都会被认为是一段注释,并不属于程序,在编译时会被直接忽略,之后这段注释也不会存在于程序中。但是一旦发生换行那就不行了:

image-20230729020416439

那要是此时注释很多,一行写不完,我们想要编写很多行的注释呢?我们可以使用多行注释标记:

image-20230729020514528

多行可以使用/**/的组合来囊括需要编写的注释内容。

当然还有一种方式就是使用/**来进行更加详细的文档注释:

image-20230729020728328

这种注释可以用来自动生成文档,当我们鼠标移动到Main上时,会显示相关的信息,我们可以自由添加一些特殊的注释,比如作者、时间等信息,也可以是普通的文字信息。

image-20230729020747000

这样,我们编写Kotlin程序的基本规则就讲解完毕了,从下一个小节开始,我们将先给各位小伙伴介绍我们的基本数据类型。


变量与基本类型

我们的程序不可能永远都只进行上面那样的简单打印操作,有些时候可能需要计算某些数据,此时我们就需要用到变量了。那么,什么是变量呢?我们在数学中其实已经学习过变量了:

变量,指值可以变的量。变量以非数字的符号来表达,一般用拉丁字母。变量的用处在于能一般化描述指令的方式。结果只能使用真实的值,指令只能应用于某些情况下。变量能够作为某特定种类的值中任何一个的保留器。

比如一个公式 x + 2 = 6 此时x就是一个变量,变量往往代表着某个值,比如这里的x就代表的是4这个值。在Kotlin中,我们也可以让变量去代表一个具体的值,并且变量的值是可以发生变化的,在程序中,我们也可以使用变量,并且变量具有类型。

计算机中的二进制表示(选学)

进入到变量的学习之前,我们需要先补充一下计算机的底层知识,否则各位小伙伴后面听起来会很困难。

在计算机中,所有的内容都是二进制形式表示。十进制是以10为进位,如9+1=10;二进制则是满2进位(因为我们的计算机是电子的,电平信号只有高位和低位,你也可以暂且理解为通电和不通电,高电平代表1,低电平代表0,由于只有0和1,因此只能使用2进制表示我们的数字!)比如1+1=10=2^1+0,一个位也叫一个bit,8个bit称为1字节,16个bit称为一个字,32个bit称为一个双字,64个bit称为一个四字,我们一般采用字节来描述数据大小。

注意这里的bit跟我们生活中的网速MB/s是不一样的,小b代表的是bit,大B代表的是Byte字节(8bit = 1Byte字节),所以说我们办理宽带的时候,100Mbps这里的b是小写的,所以说实际的网速就是100/8 = 12.5 MB/s了。

十进制的7 -> 在二进制中为 111 = 2^2 + 2^1 + 2^0

现在有4个bit位,最大能够表示多大的数字呢?

  • 最小:0000 => 0
  • 最大:1111 => 23+22+21+20 => 8 + 4 + 2 + 1 = 15

在Kotlin中,无论是小数还是整数,他们可以带有符号,因此,首位就作为我们的符号位,还是以4个bit为例,首位现在作为符号位(1代表负数,0代表正数):

  • 最小:1111 => -(22+21+2^0) => -7
  • 最大:0111 => +(22+21+2^0) => +7 => 7

现在,我们4bit能够表示的范围变为了-7~+7,这样的表示方式称为原码。虽然原码表示简单,但是原码在做加减法的时候,很麻烦!以4bit位为例:

1+(-1) = 0001 + 1001 = 怎么让计算机去计算?(虽然我们知道该去怎么算,但是计算机不知道!)

我们得创造一种更好的表示方式!于是我们引入了反码

  • 正数的反码是其本身
  • 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反

经过上面的定义,我们再来进行加减法:

1+(-1) = 0001 + 1110 = 1111 => -0 (直接相加,这样就简单多了!)

思考:1111代表-0,0000代表+0,在我们实数的范围内,0有正负之分吗?0既不是正数也不是负数,那么显然这样的表示依然不够合理!根据上面的问题,我们引入了最终的解决方案,那就是补码,定义如下:

  • 正数的补码就是其本身 (不变!)
  • 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1(即在反码的基础上+1,此时1000表示-8)
  • 对补码再求一次补码就可得该补码对应的原码。

比如-7原码为1111,反码为1000,补码就是1001了,-6原码为1110,反码为1001,补码就是1010。所以在补码下,原本的1000就作为新增的最小值-8存在。

所以现在就已经能够想通,-0已经被消除了!我们再来看上面的运算:

1+(-1) = 0001 + 1111 = (1)0000 => +0 (现在无论你怎么算,也不会有-0了!)

所以现在,1111代表的不再是-0,而是-1,相应的,由于消除-0,负数多出来一个可以表示的数(1000拿去表示-8了),那么此时4bit位能够表示的范围是:-8~+7(Kotlin使用的就是补码!)在了解了计算机底层的数据表示形式之后,我们再来学习这些基本数据类型就会很轻松了。

变量的声明与使用

要声明一个变量,我们需要使用以下格式:

kotlin 复制代码
var [变量名称] : [数据类型]

这里的数据类型我们会在下节课开始逐步讲解,比如整数就是Int类型,不同类型的变量可以存储不同的类型的值。后面的变量名称顾名思义,就像x一样,这个名称我们可以随便起一个,但是注意要满足以下要求:

  • 标识符可以由大小写字母、数字、下划线(_)和美元符号($)组成,但是不能以数字开头。
  • 变量不能重复定义,大小写敏感,比如A和a就是两个不同的变量。
  • 不能有空格、@、#、+、-、/ 等符号。
  • 应该使用有意义的名称,达到见名知意的目的(一般我们采用英文单词),最好以小写字母开头。
  • 不可以是 true 和 false。
  • 不能与Kotlin语言的关键字或是基本数据类型重名

当然各位小伙伴没必要刻意去进行记忆有哪些关键字,我们会在学习的过程中逐步认识到这些关键字。新手要辨别一个单词是否为关键字,只需要通过IDEA的高亮颜色进行区分即可,比如:

image-20230729021646779

深色模式下,关键字会高亮为橙色,浅色模式下会高亮为深蓝色,普通的代码都是正常的灰白色。

比如现在我们想要定义一个整数(Int)类型的变量a,那么就可以这样编写:

kotlin 复制代码
fun main() {
    var a : Int
}

但是这个变量一开始没有任何值,比如现在我们要让这个变量表示10,那么就可以将10赋值给这个变量:

kotlin 复制代码
fun main() {
    var a : Int = 10
}

不过由于变量在一开始就被赋值为10这个整数,此时类型是确定的,Kotlin的编译器非常聪明,它支持自动推断类型,这里会自动将变量a的类型推断为Int类型,我们可以直接省略掉后面的Int类型:

kotlin 复制代码
fun main() {
    var a = 10
}

或者我们可以在使用时再对其进行赋值:

kotlin 复制代码
fun main() {
    var a : Int
    a = 10
}

是不是感觉跟数学差不多?这种写法对于我们人来说,实际上是很好理解的,意思表达很清晰。为了更直观地查看变量的值,我们可以直接将变量的值也给打印到控制台:

kotlin 复制代码
fun main() {
    var a = 10
    println(a)
}
image-20230729130856235

变量的值也可以在中途进行修改:

kotlin 复制代码
fun main() {
    var a = 666
    a = 777
    println(a)   //这里打印得到的就是777
}

变量的值也可以直接指定为其他变量的值:

kotlin 复制代码
fun main() {
    var a = 10
    var b = a //直接让b等于a,那么a的值就会给到b
    println(b) //这里输出的就是10了
}

我们还可以让变量与数值之间做加减法(运算符会在后面详细介绍):

kotlin 复制代码
fun main() {
    var a = 9   //a初始值为9
    a = a + 1   //a = a + 1也就是将a+1的结果赋值给a,跟数学是一样的,很好理解对吧
    println(a)  //最后得到的结果就是10了
}

对于那些只读的变量,我们可以将其表示为一个常量,使用val关键字:

kotlin 复制代码
fun main() {
    val a = 666 //使用val关键字,表示这是一个常量
    a = 777;    //常量的值不允许发生修改
}

编译时得到报错:

image-20230729142023779

常量的值只有第一次赋值可以修改,其他任何情况下都不行:

kotlin 复制代码
fun main() {
    val a: Int
    a = 777;
}

至此,声明变量和常量我们就介绍完毕了,下一部分我们将介绍常见的一些数据类型。

大纲 (于 2025年1月1日 更新)
正在加载页面,请稍后...