注意: 在开始学习之前,推荐各位小伙伴有一定的编程语言基础,前置课程:《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/
Kotlin 是一种现代化的静态类型编程语言,具有以下优势:
总的来说,Kotlin 是一门功能丰富、可读性高、与 Java 无缝互操作的编程语言,适用于 Android、Web 后端开发等多种场景。
正是因为Kotlin与Java的高度兼容性,再加上简洁、安全、互操作性强等特点,让Kotlin一度成为Android开发的官方指定语言。并且随着时代的发展,现在它不仅仅可以开发安卓应用程序,也可以开发iOS程序,甚至开发Java后端、开发桌面应用程序等。其简洁高效的语法也受到一众开发者追捧。
从下节课开始,我们就来正式学习一下Kotlin语言,Kotlin,启动!
欢迎大家进入到Kotlin程序设计的学习中,我们将从开发环境配置开始,为各位小伙伴讲解。
编程语言可以被视为人与计算机之间进行交流的方式。它是一种用于编写计算机程序的形式化语言,用于描述计算机任务的操作步骤、算法和数据结构。简单来说,就是以计算机能听懂的语言告诉计算机我们要做什么,然后让计算机来做我们想做的事情,从而解决我们生活中各种各样的问题。
编程语言可以分为多种类型,包括低级语言和高级语言。低级语言(如汇编语言)与计算机硬件更接近,对计算机底层操作进行更精细的控制,但编写和理解起来较为复杂。高级语言(如Java、Python等)则更加易读、易写,并提供了更高层次的抽象,使得程序员能够更专注于问题的解决和算法的设计。而我们这里要学习的Kotlin语言,也属于高级语言的一种,能够使用我们人类更容易理解的语法来编写程序。
要开发Kotlin程序,我们首先需要安装Java环境,我们一般使用Kotlin都是在JVM平台上进行开发(Kotlin同样可以开发系统原生程序、JavaScript程序、安卓程序、iOS程序等)因为Java支持跨平台,能在编译后再任意平台上运行,因此,我们将JVM环境中学习Kotlin程序的开发,接下来我们要安装两个环境:
首先我们来安装Java 8 环境,这里我们需要去下载JDK,这里推荐安装免费的ZuluJDK:https://www.azul.com/downloads/?version=java-8-lts&package=jdk
在这里选择自己的操作系统对应的安装包:
比如Windows下,我们就选择.msi
的安装包即可(MacOS、Linux下同样选择对应的即可)
下载完成后,我们直接双击安装:
**注意,这里不建议各位小伙伴去修改安装的位置!**新手只建议安装到默认位置(不要总担心C盘不够,该装的还是要装,尤其是这种环境,实在装不下就去将其他磁盘的空间分到C盘一部分)如果是因为没有安装到默认位置出现了任何问题,你要是找不到大佬问的话,又得重新来一遍,就很麻烦。
剩下的我们只需要一路点击Next即可,安装完成之后,我们打开CMD命令窗口(MacOS下直接打开“终端”)来验证一下(要打开CMD命令窗口,Windows11可以直接在下面的搜索框搜索cmd即可,或者直接在文件资源管理器路径栏输入cmd也可以)
我们直接输入java命令即可:
如果能够直接输出内容,说明环境已经安装成功了,正常情况下已经配置好了,我们不需要手动去配置什么环境变量,所以说安装好就别管了。
输入java -version
可以查看当前安装的JDK版本:
只要是1.8.0就没问题了,后面的小版本号可能你们会比我的还要新。
接着是Kotlin 1.9.0 环境,我们需要前往:https://github.com/JetBrains/kotlin/releases 下载最新的Kotlin编译器并进行安装:
这里我们可以直接解压然后拖入到刚刚Java安装的同级目录下,我这里是 C:\Program Files 文件夹,也可以自定义位置,但是不推荐,因为很多小伙伴配环境直接配到自闭。
然后我们需要手动配置一下环境变量,打开系统环境变量配置:
添加路径 C:\Program Files\kotlinc\bin 到Path环境变量下即可,然后我们依然打开CMD查看是否安装成功,输入kotlinc -version
来查看安装情况:
这样我们就完成了所有环境的安装,我们可以来体验一下编写并且编译运行一个简单的Kotlin程序,我们新建一个文本文档,命名为Main.txt
(如果没有显示后缀名,需要在文件资源管理器中开启一下)然后用记事本打开,输入以下内容:
fun main() {
println("Hello, World!")
}
现在看不懂代码没关系,直接用就行,我们后面会一点一点讲解的。
编辑好之后,保存退出,接着我们将文件的后缀名称修改为.kt
这是Java源程序文件的后缀名称:
此时我们打开CMD,注意要先进入到对应的路径下,比如我们现在的路径:
我们使用cd
命令先进入到这个目录下:
要编译一个Kotlin程序,我们需要使用kotlinc
命令来进行,将我们的程序编译为jar包,并包含Kotlin的运行时依赖:
kotlinc Main.kt -include-runtime -d Main.jar
执行后,可以看到目录下多出来了一个.jar
文件,这是一个打包好的标准Java程序:
接着我们就可以将其交给JVM运行了,我们直接使用java -jar
命令即可:
可以看到打印了一个 Hello World! 字样,这样我们的第一个Kotlin程序就成功运行了。
前面我们介绍了Kotlin开发环境的安装以及成功编译运行了我们的第一个Kotlin应用程序。
但是我们发现,如果我们以后都使用记事本来进行Kotlin程序开发的话,是不是效率太低了点?我们还要先编辑,然后要改后缀,还要敲命令来编译,有没有更加方便一点的写代码的工具呢?这里我们要介绍的是:IntelliJ IDEA(这里不推荐各位小伙伴使用Eclipse,因为操作上没有IDEA这么友好)
IDEA准确来说是一个集成开发环境(IDE),它集成了大量的开发工具,编写代码的错误检测、代码提示、一键完成编译运行等,非常方便。
下载地址:IntelliJ IDEA:JetBrains 功能强大、符合人体工程学的 Java IDE
我们直接点击下载即可,注意要下载下面的社区版,不要下载到终极版了:
这个软件本身是付费的,比较贵,而且最近还涨价了,不过这里我们直接下载面的社区版本就行了(JavaSE学习阶段不需要终极版,但是建议有条件的还是申请一个,功能更强大,体验更友好)
下载好之后,直接按照即可,这个不强制要求安装到C盘,自己随意,但是注意路径中不要出现中文!
这里勾选一下创建桌面快捷方式就行:
安装完成后,我们直接打开就可以了:
此时界面是全英文,如果各位小伙伴看得惯,可以直接使用全英文的界面(使用英文界面可以认识更多的专业术语词汇,但是可能看起来没中文那么直观,而且IDEA本身功能就比较多,英语不好的小伙伴就很头疼)这里还是建议英语不好的小伙伴使用中文界面,要使用中文只需要安装中文插件即可:
我们打开Plugins插件这一栏,然后直接在插件市场里面搜索Chinese,可以找到一个中文语言包的插件,我们直接Install安装即可,安装完成后点击重启,现在就是中文页面了:
如果各位小伙伴不喜欢黑色主题,也可以修改为白色主题,只需要在自定义中进行修改即可,一共四种主题,我们还可以在下面的设置中开启新UI以及更换各种字体、字体大小等个性化内容。
如果你之前使用过其他IDE编写代码,这里还支持按键映射(采用其他IDE的快捷键方案)有需要的可以自己修改一下:
接下来,我们来看看如何使用IDEA编写Kotlin程序,IDEA是以项目的形式对一个Java程序进行管理的,所以说我们直接创建一个新的项目,点击新建项目:
此时来到创建页面:
当然,如果JDK这里没有自动识别到,那么就手动添加一下:
没问题之后,我们直接创建项目:
进入之后,可以看到已经自动帮助我们创建好了一个kt
源文件,跟我们之前的例子是一样的。要编译运行我们的Kotlin程序,只需要直接点击左边的三角形(启动按钮)即可:
点击之后,会在下方自动开始构建:
完成之后,就可以在控制台看到输出的内容了:
我们可以看到新增加了一个out
目录,这里面就是刚刚编译好的.class
文件,这种文件是Java的字节码文件,可以直接运行在JVM中:
IDEA非常强大,即使是编译之后的字节码文件,也可以反编译回原代码的样子:
如果我们想写一个新的Kotlin项目,可以退出当前项目重新创建:
此时项目列表中就有我们刚刚创建的Java项目了:
如果你还想探索IDEA的其他功能,可以点击欢迎页最下方的学习:
会有一个专门的引导教程项目,来教你如何使用各项功能:
熟悉了IDEA的使用之后,下节课我们就可以正式地开始学习Kotlin语言的语法了。
还记得我们之前使用的示例代码吗?
fun main() {
println("Hello World!")
}
这段代码要实现的功能很简单,就是将 Hello World 这段文本信息输出到控制台。
在编写代码时,注意需要区分大小写,Kotlin语言严格区分大小写,如果我们没有按照规则来编写,那么就会出现红色波浪线报错:
只要源代码中存在报错的地方,就无法正常完成编译得到字节码文件,强行运行会提示构建失败:
注意这里包括的花括号是成对出现的,并且一一对应。
所以说各位小伙伴在编写代码时一定要注意大小写。然后第二行,准确的说是最外层花括号内部就是:
fun main() {
}
可以看到外面使用花括号前添加了fun main()
,这是我们整个程序的入口点,我们的Kotlin程序也是从这里开始从上往下执行的。而其中的println
语句就是用于打印其括号中包裹的文本,我们可以看到这个文本信息使用了""
进行囊括,否则会报错:
println("Hello World!")
这段代码的意思就是将双引号括起来的内容(字符串,我们会在后面进行讲解)输出(打印)到控制台上。
比如下面的代码,我们就可以实现先打印Hello World!,然后再打印 KFC vivo 50 到控制台:
fun main() {
println("Hello World!")
println("KFC vivo 50")
}
效果如下:
注意我们上面编写的打印语句其实是函数的调用(后续会进行讲解)不能写到同一行中,否则编译器会认为是同一句代码,同样会导致编译不通过:
如果实在要写到同一行,那么我们需要在上一句代码最后添加;
来表示上一段的结束:
再比如下面的代码:
这里我们尝试在中途换行或是添加空格,因为没有添加分号,所以说编译器依然会认为是一行代码,因此编译不会出现错误,能够正常通过。当然,为了代码写得工整和规范,我们一般不会随意换行或是添加没必要的空格。注意随意换行和空格仅限于可分割区域,比如println
本身是一个函数的完整名称,这就不能从中间直接断开,否则语义就完全不一样了。
我们在编写代码时,可能有些时候需要标记一下这段代码表示什么意思:
但是如果直接写上文字的话,会导致编译不通过,因为这段文字也会被认为是程序的一部分。
这种情况,我们就需要告诉编译器,这段文字是我们做的笔记,并不是程序的一部分,那么要怎么告诉编译器这不是代码呢?很简单,我们只需要在前面加上双斜杠就可以了:
添加双斜杠之后(自动变成了灰色),后续的文本内容只要没有发生换行,那么都会被认为是一段注释,并不属于程序,在编译时会被直接忽略,之后这段注释也不会存在于程序中。但是一旦发生换行那就不行了:
那要是此时注释很多,一行写不完,我们想要编写很多行的注释呢?我们可以使用多行注释标记:
多行可以使用/*
和*/
的组合来囊括需要编写的注释内容。
当然还有一种方式就是使用/**
来进行更加详细的文档注释:
这种注释可以用来自动生成文档,当我们鼠标移动到Main上时,会显示相关的信息,我们可以自由添加一些特殊的注释,比如作者、时间等信息,也可以是普通的文字信息。
这样,我们编写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位,最大能够表示多大的数字呢?
在Kotlin中,无论是小数还是整数,他们可以带有符号,因此,首位就作为我们的符号位,还是以4个bit为例,首位现在作为符号位(1代表负数,0代表正数):
现在,我们4bit能够表示的范围变为了-7~+7,这样的表示方式称为原码。虽然原码表示简单,但是原码在做加减法的时候,很麻烦!以4bit位为例:
1+(-1) = 0001 + 1001 = 怎么让计算机去计算?(虽然我们知道该去怎么算,但是计算机不知道!)
我们得创造一种更好的表示方式!于是我们引入了反码:
经过上面的定义,我们再来进行加减法:
1+(-1) = 0001 + 1110 = 1111 => -0 (直接相加,这样就简单多了!)
思考:1111代表-0,0000代表+0,在我们实数的范围内,0有正负之分吗?0既不是正数也不是负数,那么显然这样的表示依然不够合理!根据上面的问题,我们引入了最终的解决方案,那就是补码,定义如下:
比如-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使用的就是补码!)在了解了计算机底层的数据表示形式之后,我们再来学习这些基本数据类型就会很轻松了。
要声明一个变量,我们需要使用以下格式:
var [变量名称] : [数据类型]
这里的数据类型我们会在下节课开始逐步讲解,比如整数就是Int
类型,不同类型的变量可以存储不同的类型的值。后面的变量名称顾名思义,就像x
一样,这个名称我们可以随便起一个,但是注意要满足以下要求:
当然各位小伙伴没必要刻意去进行记忆有哪些关键字,我们会在学习的过程中逐步认识到这些关键字。新手要辨别一个单词是否为关键字,只需要通过IDEA的高亮颜色进行区分即可,比如:
深色模式下,关键字会高亮为橙色,浅色模式下会高亮为深蓝色,普通的代码都是正常的灰白色。
比如现在我们想要定义一个整数(Int)类型的变量a
,那么就可以这样编写:
fun main() {
var a : Int
}
但是这个变量一开始没有任何值,比如现在我们要让这个变量表示10,那么就可以将10赋值给这个变量:
fun main() {
var a : Int = 10
}
不过由于变量在一开始就被赋值为10这个整数,此时类型是确定的,Kotlin的编译器非常聪明,它支持自动推断类型,这里会自动将变量a的类型推断为Int类型,我们可以直接省略掉后面的Int类型:
fun main() {
var a = 10
}
或者我们可以在使用时再对其进行赋值:
fun main() {
var a : Int
a = 10
}
是不是感觉跟数学差不多?这种写法对于我们人来说,实际上是很好理解的,意思表达很清晰。为了更直观地查看变量的值,我们可以直接将变量的值也给打印到控制台:
fun main() {
var a = 10
println(a)
}
变量的值也可以在中途进行修改:
fun main() {
var a = 666
a = 777
println(a) //这里打印得到的就是777
}
变量的值也可以直接指定为其他变量的值:
fun main() {
var a = 10
var b = a //直接让b等于a,那么a的值就会给到b
println(b) //这里输出的就是10了
}
我们还可以让变量与数值之间做加减法(运算符会在后面详细介绍):
fun main() {
var a = 9 //a初始值为9
a = a + 1 //a = a + 1也就是将a+1的结果赋值给a,跟数学是一样的,很好理解对吧
println(a) //最后得到的结果就是10了
}
对于那些只读的变量,我们可以将其表示为一个常量,使用val
关键字:
fun main() {
val a = 666 //使用val关键字,表示这是一个常量
a = 777; //常量的值不允许发生修改
}
编译时得到报错:
常量的值只有第一次赋值可以修改,其他任何情况下都不行:
fun main() {
val a: Int
a = 777;
}
至此,声明变量和常量我们就介绍完毕了,下一部分我们将介绍常见的一些数据类型。