Kotlin从基础到实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-10-07 10:41:22

点击下载

作者:黑马程序员

出版社:人民邮电出版社有限公司

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Kotlin从基础到实战

Kotlin从基础到实战试读:

前言

为什么要学习Kotlin

Kotlin是JetBrains公司开发的基于JVM的语言。该语言完全兼容Java的特性,并且已经正式成为Android官方支持的开发语言。它可以编译成Java字节码,也可以编译成JavaScript字节码,方便在没有JVM的设备上运行。它比Java语言更简洁、更安全、易扩展,能够静态检测常见陷阱,也可以应用于Android开发、JavaScript开发、服务器端开发的程序中。由于从实际使用效果来说,Kotlin语言比Java语言的开发效率高并且使用更安全,因此Kotlin语言的应用越来越广泛。

如何使用本书

本书是一本Kotlin基础入门书籍,使用IntelliJ IDEA作为开发工具。作为一种技术的入门图书,最重要也最难办的一件事是将一些非常复杂、难以理解的思想和问题简单化,让初学者能够轻松理解并快速掌握。本书先对每个知识点都进行了深入的分析,并针对每个知识点精心设计了相关案例,然后模拟这些知识点在实际工作中的运用,真正做到了学习过程的由浅入深、由易到难。初学者在使用本书时,建议从头开始循序渐进地学习,并且反复练习书中案例,以达到熟能生巧。

本书共分为13章,接下来分别对每章进行简单的介绍,具体内容如下。

• 第1章主要讲解Kotlin语言的特性与IntelliJ IDEA工具的安装。通过对本章的学习,初学者能够掌握IntelliJ IDEA的安装过程,动手实现属于自己的第一个Kotlin程序。

• 第2章主要讲解Kotlin语言的基本语法,不论任何一门语言,其基本语法都是最重要的内容。在学习基本语法时,一定要做到认真学习每一个知识点,切忌走马观花。

• 第3章主要讲解函数,包括函数的分类与使用。通过对本章的学习,初学者可以了解函数的定义以及如何使用不同类型的函数。

• 第4章主要讲解Kotlin语言最重要的特征——面向对象。本章内容以编程思想为主,初学者需要花费很大的精力来理解本章所讲解的内容。

• 第5~7章主要讲解Kotlin中的集合、Lambda编程以及泛型,包括集合中的List接口、Set接口、Map接口、Lambda表达式、高阶函数、内联函数、泛型的约束、协变与逆变等,这几章的内容非常重要,在后续Kotlin程序开发中会经常用到,因此,要求初学者一定要熟练掌握这部分内容。

• 第8章主要讲解Gradle,包括如何创建Gradle程序、Gradle的任务、Gradle的依赖、Gradle的扩展。通过对本章的学习,初学者可以完成简单的Gradle程序开发。

• 第9章主要讲解协程,包括协程的挂起、主协程、协程取消、管道等。通过对本章的学习,初学者可以掌握协程的基本操作与使用。

• 第10章主要讲解坦克大战游戏的开发,该游戏总结了第1~9章的知识点。通过对本章的学习,初学者可以熟练运用Kotlin中的基础开发技术。

• 第11~13章主要讲解DSL、Kotlin与Java互操作以及时钟项目,包括DSL的使用、Kotlin与Java相互调用、Kotlin与Java互操作对比、使用Kotlin语言实现一个JavaScript语言的时钟项目。通过对这3章的学习,初学者可以掌握Kotlin与Java代码如何进行相互调用以及如何运用Kotlin语言实现一个JavaScript语言的项目。

在上面所提到的13章中,第1~3章主要是针对Kotlin的一些比较基础的知识进行详细的讲解,这些知识多而细,要求初学者深入理解,奠定好学习后面知识的基础。第4~9章中每个小节的知识点后都会提供一个实用的案例,并在案例后面对其进行详细的分析,初学者可以结合案例后的分析对案例进行学习,每一个案例都需要动手实践。第10章主要是总结第1~9章的知识点,实现了一个坦克大战游戏的开发。初学者学习本章时要求动手实现该游戏的全部效果。第11章的内容了解即可,第12~13章主要讲Kotlin与Java语言的交互以及如何运用Kotlin语言编写一个JavaScript语言的时钟项目,这两章的内容比较重要,需要初学者掌握并可以灵活运用其中的知识。

在学习本书时,首先要做到对知识点理解透彻,其次一定要亲自动手去练习书中所提供的案例,因为在学习软件编程的过程中动手实践是非常重要的。对于一些非常难以理解的知识点也可以选择通过案例的练习来学习。如果实在无法理解书中所讲解的知识,建议初学者不要纠结于某一个知识点,可以先往后学习,通常来讲,看到后面对知识点的讲解或者其他小节的内容后,前面看不懂的知识点一般就能理解了。

致谢

本书的编写和整理工作由传智播客教育科技有限公司完成,主要参与人员有吕春林、陈欢、柴永菲、闫文华、高美云、张泽华、吴通、肖琦、伍碧林、马伟奇等,研发小组全体成员在这近一年的编写过程中付出了很多辛勤的汗水,在此一并表示衷心的感谢。

意见反馈

尽管我们尽了最大的努力,但书中难免会有不妥之处,欢迎各界专家和读者来信给予宝贵意见,我们将不胜感激。您在阅读本书时,如果发现任何问题或有不认同之处可以通过电子邮件与我们取得联系。

请发送电子邮件至:itcast_book@vip.sina.com黑马程序员2018年10月于北京第1章 Kotlin入门学习目标

• 了解什么是Kotlin

• 掌握Kotlin开发环境的搭建方法

• 掌握Kotlin程序的编写方法

Kotlin是由JetBrains公司开发的,用于多平台应用的静态编程语言。2017年谷歌I/O大会上Android团队宣布Kotlin成为其官方头等支持语言。它可以被编译成Java字节码,100%兼容Java语言,也可以被编译成JavaScript,方便在没有JVM的设备上运行。它比Java更简洁、更安全,能够静态检测常见的陷阱。本章将针对Kotlin语言的前景、特性、开发环境以及如何编写Kotlin程序等内容进行详细讲解。1.1 Kotlin简介1.1.1 Kotlin的前景

Kotlin语言由JetBrains公司开发,是一个基于JVM的新编程语言,它的语法格式比Java更加简洁,现在已经正式成为Android官方支持的开发语言,并且100%兼容Java语言。目前Kotlin语言主要用于以下几个领域。

1. 服务端开发

Kotlin语言非常适合开发服务端应用程序,并且与Java技术保持良好的兼容性,之前用Java语言做的服务端程序都可以使用Kotlin语言来代替。Kotlin的革新式语言功能有助于构建强大而易于使用的程序。Kotlin语言对协程的支持有助于构建服务器端程序,伸缩到适度的硬件要求以应对大量的客户端。Kotlin语言与所有基于Java语言的框架完全兼容,可以让你保持熟悉的技术栈,同时获得更现代化的语言优势。

2. Android开发

Kotlin语言也适合开发Android程序。在兼容性方面,Kotlin语言与JDK 6完全兼容,保证了Kotlin应用程序可以在较旧的Android设备上运行。在性能方面,由于Kotlin支持内联函数,使用Lambda表达式的代码通常比使用Java的代码运行速度快,因此Kotlin应用程序的运行速度比Java快。在互操作性方面,Kotlin与Java可进行100%的互操作,在Kotlin应用程序中可以使用所有现有的Android库。在编译时长方面,Kotlin支持高效的增量编译,所以对于清理构建会有额外的开销,增量构建通常与Java一样快或者更快。

3. JavaScript开发

Kotlin提供了JavaScript作为目标平台的能力。这种能力通过将Kotlin转换为JavaScript来实现,目前的实现目标是ECMAScript 5.1。当选择JavaScript为目标时,作为项目部分的Kotlin代码以及Kotlin附带的标准库都会转换为JavaScript。但不包括使用的JDK、任何JVM、Java框架或库。所有非Kotlin文件在编译期间会被忽略掉。Kotlin编译器遵循以下目标:提供最佳大小的输出;提供可读的JavaScript输出;提供与现有模块系统的互操作性;在标准库中提供相同的功能。1.1.2 Kotlin的特性

1. 简洁

在开发程序时,通常情况下开发人员会花费更多的时间去阅读现有代码。例如,需要在当前项目上添加新的功能,此时就需要阅读与当前功能相关的代码,而阅读代码的时间长短取决于代码量的多少。在Kotlin程序中,由于代码简洁,从而大大减少了样板代码的数量,因此在后续阅读代码时会更加简便,这就提高了工作效率,进而可以更快地完成任务。在许多情况下,IDEA工具将自动检测到可以用更简洁的结构替换公共的代码模式,并提供修复代码的方法,通过研究这些自动修复所使用的语言特性,可以在开发程序时灵活应用这些特性。

2. 安全

一般情况下,为了保证编程语言的安全性,在设计程序时会尽量避免出错的可能,当然这并不能保证程序绝对不会出现问题。防止错误的发生通常以牺牲成本为代价,需要给编译器更多关于程序的预期操作信息,这样编译器就可以验证与程序所做的匹配信息是否一致。

Kotlin试图用较小的成本获取比Java更高级别的安全性。在JVM上运行的程序已经提供了许多安全机制,例如,防止内存泄露、防止缓冲区溢出以及由于不正确使用动态分配内存造成的其他问题等。Kotlin作为一种静态语言,在JVM上也保证应用程序的类型安全,不必指定所有类型的声明。很多情况下,编译器会自动推断类型。此外,Kotlin允许定义可空类型变量,并提供了多种方式对空数据进行处理,这样可以避免程序的空指针异常(NullPointerException),从而大大降低了程序崩溃的可能性。

3. 互操作性

Kotlin与Java的互操作性,表现在Kotlin程序可以调用Java中的方法、扩展Java类、实现Java中的接口以及使用Java语言来注释Kotlin程序等。Kotlin中的类和方法可以完全像普通的Java类和方法一样去调用,这样Java代码与Kotlin代码可以在项目中的任何地方进行互调。其重点体现在使用现有的Java标准库扩展Java中的功能,使Kotlin程序使用起来更方便。

Kotlin的开发工具IDEA还提供了跨语言项目的全力支持,它不仅可以编译Java源文件,而且还可以使Java与Kotlin进行任意的组合。IDEA工具的跨语言功能,允许程序执行如下操作。

• 自由组合Kotlin语言与Java源文件。

• 调试混合语言项目,并在不同语言编写的程序之间进行互操作。1.2 Kotlin开发环境搭建1.2.1 Kotlin常用开发工具

在Kotlin的官方文档(www.kotlincn.net)上可以看到,Kotlin语言的开发工具有4种类型,分别是IntelliJ IDEA、Android Studio、Eclipse以及Compiler。这4种工具的简单介绍如下。

1. IntelliJ IDEA

IntelliJ IDEA是JetBrains公司开发的,是Kotlin官方推荐使用的开发工具。在Kotlin官网上下载最新版本的IntelliJ IDEA,已经默认安装了Kotlin插件。如果下载的IntelliJ IDEA没有Kotlin插件,则可以打开IntelliJ IDEA的插件安装界面,完成插件的安装或升级。

2. Android Studio

Android Studio是谷歌公司基于IntelliJ IDEA开发的一个工具,主要用于Android程序的开发。Android Studio从3.0版本开始内置安装Kotlin插件。如果使用的是3.0之前的版本,则可以通过Android Studio的插件安装界面完成Kotlin插件的安装,插件安装完成后需要重新启动Android Studio。

3. Eclipse

Eclipse是一款经典的开发工具,虽然它是由Java语言开发的,但它不仅支持Java语言,而且还支持C/C++、COBOL、PHP、Android等编程语言,现在还支持Kotlin语言。如果想要在Eclipse工具中开发Kotlin语言程序,则需要安装Kotlin插件。

4. Compiler

Compiler是一个命令行的编译器,在Kotlin官网上也可以下载这个工具,然后通过命令行来编译Kotlin程序。

以上4种工具中,Android Studio是在IntelliJ IDEA工具的基础上添加了一些针对Android开发的插件,这些插件在开发Kotlin语言的程序中是用不到的;Compiler工具用起来不太方便;Eclipse与IntelliJ IDEA工具开发Kotlin语言都比较方便。由于本书主要讲解Kotlin语言的开发,因此选择Kotlin官方推荐的工具IntelliJ IDEA。1.2.2 IntelliJ IDEA的安装

1. 下载IntelliJ IDEA

首先打开JetBrains公司官网,单击界面上的【DownLoad】按钮进入到下载界面,在这个界面上有两个选项,分别为Ultimate企业版(免费试用)与Community社区版(免费开源),这里选择Community版本的IntelliJ IDEA,点击【下载】按钮进行下载,此处下载的是最新版本的IDEA,如图1-1所示。图1-1 下载界面

需要注意的是,由于目前最新版本ideaIC-2018.1.5相对来说没有ideaIC-2017.3.5版本稳定,因此在图1-1所示界面中选择【Previous Version】链接,跳转到IDEA版本页面,选择ideaIC-2017.3.5版本进行下载,也可以根据个人习惯下载不同版本,如图1-2所示。图1-2 下载界面

2. 安装IntelliJ IDEA

在安装IntelliJ IDEA工具的过程中,可根据个人喜好选择程序的安装位置,如图1-3所示。图1-3 选择安装位置

在图1-3所示界面中,单击【Next】按钮,进入安装设置界面。在该界面Create Desktop Shortcut下方有两个复选框,用于选择计算机系统位数,分别是【32-bit launcher】和【64-bit launcher】,根据相应的系统位数(右键单击【我的电脑】,单击【属性】,查看系统位数)选择即可,如图1-4所示。图1-4 选择操作系统版本

在图1-4所示界面中,单击【Next】按钮,等待程序进行安装,最后弹出一个安装完成的对话框。在这个对话框上单击【Finish】按钮即可完成IntelliJ IDEA工具的安装,安装完成的对话框如图1-5所示。图1-5 安装完成

需要注意的是,安装完IntelliJ IDEA工具之后,还需要安装1.6以上版本的JDK,在这里就不一一截图显示安装的过程了,直接下载JDK并安装即可。1.3 开发第一个Kotlin程序

接触一门新语言时,编写的第一个程序基本都是HelloWorld,本书也不例外。本小节就教大家如何用Kotlin语言编写一个HelloWorld程序,具体步骤如下。

当第一次打开新安装的IntelliJ IDEA工具时,首先会进入欢迎界面。在这个界面上有4个选项,分别是【Create New Project】、【Import Project】、【Open】以及【Check out from Version Control】。这4个选项分别表示的是创建一个新工程、导入一个工程、打开文件夹以及从svn或git上获取一个工程。在这里选择【Create New Project】选项,创建一个新的工程,如图1-6所示。图1-6 欢迎界面

接着会弹出一个New Project窗口,在窗口的左侧选中【Java】选项,在Project SDK对应的选项框中,点击后边的【New…】按钮,选择JDK的安装位置,勾选上【Kotlin/JVM】复选框,单击【Next】按钮进入下一步,如图1-7所示。图1-7 New Project窗口

最后设置该项目的名称(Project name)为Chapter01,项目存放的位置(Project location)可自行设置,单击【Finish】按钮完成Chapter01项目的创建,如图1-8所示。图1-8 设置项目名称与位置

项目创建完成了,此时在IntelliJ IDEA中会显示创建好的Chapter01程序,右键单击【src】,选择【New】→【Package】选项,创建com.itheima.chapter01包,如图1-9所示。图1-9 创建包名

包创建完成后,右键单击com.itheima.chapter01包名,选择【New】→【Kotlin File/Class】选项,创建HelloWorld.kt文件,如图1-10所示。图1-10 创建HelloWorld.kt文件

HelloWorld.kt文件创建完后,接着需要创建程序的入口函数main(),IntelliJ IDEA提供了一个快速完成此操作的模板,只需在HelloWorld.kt文件中写入“main”,然后按【Tab】键或【Enter】键即可自动创建一个main()函数,如图1-11所示。图1-11 创建main( )函数

在main()函数中,添加一行输出语句“println("Hello World")”,然后单击图标或在HelloWorld.kt文件中右击,选择“Run 'HelloWorldKt'”选项运行该程序,即可输出“Hello World”,如图1-12所示。图1-12 输出HelloWorld

至此,HelloWorld程序已经开发完成。接下来针对程序中的语句进行简单介绍,具体如下。

• fun:函数的声明。

• main(args:Array<String>):main()函数是Kotlin程序的入口函数,即程序启动时运行的第一个函数。args是该函数接收的参数名,该参数的数据类型是字符串数组类型。

• println():用于向控制台输出HelloWorld字符串。

多学一招:将项目导入IDEA工具中

由于IDEA工具没有专门针对不同项目做特殊的优化,只识别一些Gradle或Maven项目,因此如果后续需要将项目Chapter01导入到IDEA工具中,则必须选择【File】→【Open】选项来打开该项目而不是选择【File】→【New】→【Project from Existing Sources…】选项,这是因为选择【Project from Existing Sources…】时,会覆盖项目中的Chapter01.iml文件,覆盖后该文件中就没有Kotlin的Jar包依赖信息了,此时程序会运行不了,因此,为了方便后续成功导入之前创建的项目,选择【Open】选项即可,如图1-13所示。图1-13 将项目导入IDEA工具中注意

本书以章节名称作为项目名,例如Chapter01、Chapter02…以此类推。项目包名以“com.itheima.+章节名”来命名,例如com.itheima.chapter01。1.4 本章小结

本章主要讲解了Kotlin语言的前景、特性以及开发环境的搭建,最后通过一个HelloWorld程序来讲解如何开发Kotlin程序。本章所讲解的内容是Kotlin中最基础的知识,要求初学者必须熟练掌握,为后面学习Kotlin语言的其他知识打下坚实的基础。【思考题】

1. 请思考Kotlin语言有哪些特性。

2. 请思考如何通过Kotlin语言编写一个HelloWorld程序。第2章 Kotlin编程基础学习目标

• 记住Kotlin的基本语法格式

• 记住Kotlin中的变量

• 记住Kotlin中的运算符、字符串

• 掌握Kotlin中选择结构语句、循环结构语句的用法

• 掌握Kotlin中变量类型转换、空值处理的操作方法

无论学习哪一门编程语言,基础知识都是至关重要的。Kotlin语言也不例外,同样需要先掌握Kotlin语言的基础知识,才能熟练使用Kotlin语言。本章将针对Kotlin的基本语法、变量、运算符、字符串、选择结构语句、循环结构语句、区间、数组、变量的类转换以及空值处理进行详细的讲解。2.1 Kotlin的基本语法2.1.1 Kotlin代码的基本格式

在Kotlin中,程序都会包含一个main()函数,作为程序的入口。该函数中会包含一些输出语句以及返回值等信息。main()函数的语法格式如下:fun main(args: Array) { println("Hello World") }

在上述语法格式中,“fun”表示函数声明,“main()”表示函数入口,其中的args是函数接收的参数名,Array<String>是参数的数据类型(字符串数组类型),“println("Hello World")”为函数的输出语句。在实际开发中,可以根据main()函数的语法格式自定义函数。

需要注意的是,在Kotlin中程序代码可分为结构定义语句和功能执行语句,其中,结构定义语句用于声明一个类或函数,功能执行语句用于实现具体的功能。每条单行的功能执行语句后面可以省略英文半角分号(;)。如果一行代码中有两条执行语句,则这两条语句中间必须用英文分号隔开,否则编译器会提示“Unexpected tokens”(意外的标记)这样的错误信息。

在Kotlin中,为了方便管理Kotlin源文件的目录结构,防止不同的Kotlin源文件之间发生命名冲突,可以使用“package(包)”管理文件,如果不定义包,源文件则存放在无包名的默认包中。定义package的语法格式如下:package com.itheima

Kotlin虽然没有严格要求用什么样的风格来编写代码,但是,出于可读性的考虑,应该让自己编写的程序代码整齐美观、层次清晰。在编写代码时,需要注意以下几个方面。(1)Kotlin语言是严格区分大小写的。Kotlin语言与Java语言类似,在定义类时,不能将class写成Class,否则编译器会报错。在程序中定义一个animal时,也可以同时定义一个Animal,animal和Animal是两个完全不同的符号,在使用时务必注意。(2)如果不确定Kotlin编码规范时,默认使用Java的编码规范。例如使用驼峰命名法(避免命名中有下划线),类名以大写字母开头,方法和属性以小写字母开头等。(3)Kotlin程序中的一个字符串不能分开在两行中书写,例如,下面这条语句在编译时会出错:fun main(args: Array) { println("Hello World") }

如果为了便于阅读,需要将一个长字符串在两行中书写,则可以将这个长字符串分成两个短字符串,然后用加号(+)将这两个字符串连起来,在加号(+)处断行。上面的语句可以修改成如下形式:fun main(args: Array) { println("Hello" + "World") } 2.1.2 Kotlin中的注释

在编写程序时,为了使代码易于阅读,通常会在实现功能的同时为代码加一些注释。注释是对程序的某个功能或者某行代码的解释说明,它只在Kotlin源文件中有效,在编译程序时编译器会忽略这些注释信息,不会将其编译到class字节码文件中。

1. 单行注释

单行注释通常是对程序中的某一行代码进行解释,用符号“//”表示,“//”后面为被注释的内容,具体示例如下:println("Hello World") //输出Hello World 字符串

2. 多行注释

多行注释就是注释中的内容可以是多行,以符号“/*”开头,以符号“*/”结尾。多行注释的示例如下:/* fun main(args: Array) { println("Hello World") } * /

3. 文档注释

文档注释是以“/**”开头,并在注释内容末尾以“*/”结束,是对一段代码概括的解释说明。文档注释的示例如下:/**fun main(args: Array) { println("Hello World") }* /注意

多行注释“/*…*/”中可以嵌套单行注释“//”。与Java程序不同的是,Kotlin程序中的多行注释“/*…*/”中可以嵌套多行注释“/*…*/”。2.2 Kotlin中的变量2.2.1 变量的定义

在程序运行期间,随时可能产生一些临时的数据,应用程序会将这些数据保存在一些内存单元中,每个内存单元都用一个标识符来标识。这些内存单元被称为变量,定义的标识符就是变量名,内存单元中存储的数据就是变量的值。

Kotlin中的变量分为两种类型,分别是可变变量与不可变变量(只读变量),可变变量用关键字var来修饰,可以进行多次修改。不可变变量用关键字val来修饰,只能进行一次初始化。可变变量对应的是Java语言中的普通变量,不可变变量对应的是Java语言中用final关键字修饰的常量。

接下来,我们通过具体的代码来学习如何声明变量以及给变量赋值。

1. 声明变量

声明一个可变变量与不可变变量的语法格式如下:var变量名:数据类型val变量名:数据类型

上述格式中,var表示声明的是一个可变变量,val表示声明的是一个不可变变量,变量名是自定义的,数据类型是表示该变量属于什么类型的数据。

声明一个可变变量与不可变变量的示例代码如下:var a: Int //声明一个Int 类型的可变变量a val b: String //声明一个String 类型的不可变变量b

2. 给变量赋值

在Kotlin中给变量赋值分为两种方式,第1种是声明变量的同时给变量赋值,第2种是声明变量和变量赋值分开设置。接下来通过具体代码来演示这两种方式。(1)声明变量的同时给变量赋值,具体示例如下:var c: Int = 1

上述代码中,Int类型变量c被赋值为1。“=”前边的部分主要是声明了一个Int类型的变量c,“=”后边是给声明的变量c赋值为1。

值得一提的是,上述直接赋值变量的方式,可以省略变量的数据类型,Kotlin会根据变量的值自动识别变量的数据类型,其他类型的变量也一样。具体示例如下:var c = 1 (2)声明变量和变量赋值可以分开设置,具体示例如下:var d: Int d = 10

上述代码中,首先声明了一个Int类型的变量d,接着将变量d赋值为10。

脚下留心:声明变量与给变量赋值时遇到的问题(1)在不赋值的情况下,只声明变量不约束具体类型时,程序会报错,具体示例如下:var c //只声明不约束具体类型会报错 (2)在同一方法体中,不能重复定义一个变量,否则编译器会提示命名冲突,具体示例如下:fun main(args: Array) { var a: String //变量为String 类型 // var a: String="" 重复定义变量a 会报错} (3)可变变量可以多次赋值,不可变变量不可以进行二次赋值,具体示例如下:fun main(args: Array) { var a: Int // 可变变量a val b: Int // 不可变变量b //可以多次给变量a 赋值 a = 1 a = 2 a = 3 b = 1 //第1 次给变量b 赋值 // b = 2 第2 次给变量b 赋值会报错 }2.2.2 变量的数据类型

任何编程语言都有自己的数据类型,例如,Java语言中的数据类型包含基本数据类型和引用数据类型,其中基本数据类型包含数值型、字符型、布尔型,引用数据类型包括类、接口、数组、枚举、注解。而Kotlin语言中的数据类型不区分基本数据类型和引用数据类型,分为数值型、字符型、布尔型、数组型、字符串型,接下来分别对这些数据类型进行讲解。

1. 数值类型变量

Kotlin中的数值类型与Java中数值类型相似,包括Byte(字节)、Short(短整型)、Int(整型)、Long(长整型)、Float(浮点型)、Double(双精度浮点型),只不过在Java中这些数值类型用小写字母表示,而在Kotlin中用首字母大写的形式表示。Kotlin中数值类型变量所占存储空间的大小以及存储值的范围如表2-1所示。表2-1 内置类型

表2-1中,占用空间指的是不同类型的变量占用内存的大小。例如一个Byte类型的变量会占用1个字节大小的内存空间,存储的值只77能是-2~(2-1)的整数,一个Int类型的变量会占用4个字节大小的3131内存空间,存储值范围是-2~(2-1)的整数。需要注意的是,在为Long类型的变量赋值时,所有赋值的后面要加上一个字母L(只能是大写字母L),说明赋值为Long类型。如果赋的值未超出Int的取值范围,则可以省略字母L。

Float与Double类型主要用于存储带小数的数值,在这两个类型的存储值范围中,E表示以10为底的指数,E后面的“+”和“-”代-45表正指数和负指数,例如1.4E-45表示1.4*10。在Kotlin中,一个Float类型的变量赋值时需要在值的后面加上字母F(或小写f),Double类型的变量在赋值时,值的后面不允许加D或者d,这点与Java不同。

2. 布尔类型变量

布尔类型变量用于存储布尔值,在Kotlin中用Boolean表示,该类型的变量只有两个值,分别是true和false。具体示例如下:var a: Boolean = true var b = true

3. 字符类型变量

字符类型变量用于存储一个单一字符,在Kotlin中用“Char”表示。Kotlin中每个字符类型变量都会占用2个字节。在给Char类型的变量赋值时,需要用一对英文半角格式的单引号' '把字符括起来,如'k'。具体示例如下:var a: Char = 'a' var b = 'b'

与Java不同的是,在Kotlin中Char类型的变量不能直接赋值为数字,必须使用单引号把数字括起来才可以进行赋值。

4. 字符串类型变量

字符串类型变量用于存储多个字符,它与Java中的字符类型变量非常相似。字符串类型用“String”表示,在给String类型的变量赋值时,需要用一对英文半角格式的双引号""把字符括起来。具体示例如下:var a: String = "Hello World!" var a = "Hello World!"

5. 数组类型变量

在Kotlin中,如果想定义多个类型相同的变量,用常规的定义方式则需要定义多个变量,非常麻烦,为此Kotlin中提供了数组类型变量。数组是用Array表示,其中数值类型、布尔类型、字符类型都有数组的表现形式。这些数组类型变量的初始化有两种方式,一种是以“数据类型ArrayOf()”方法进行初始化,另一种是以arrayOf()方法进行初始化。

接下来以IntArray、BooleanArray、CharArray类型数组为例来演示第1种方式,具体示例如下:var int_array: IntArray = intArrayOf(1, 2, 3) var boolean_array: BooleanArray = booleanArrayOf(true, false, true) var char_array: CharArray = charArrayOf('a', 'b', 'c')

从数组的定义格式可以看出,数组在创建时使用的是intArrayOf()方法,而不是Java中的new关键字。

需要注意的是,在Kotlin中不能使用stringArrayOf()方法创建字符串类型数组,因为String不属于基本数据类型。要想在Kotlin中声明字符串数组,需要使用Array<String>,并且对应的初始化数组的方法也相应变成了arrayOf(),这种初始化方式对于其他类型的数组同样适用。接下来以第2种方式初始化数组类型的变量,具体示例如下:var int_array1: Array = arrayOf(1, 2, 3) var boolean_array1: Array = arrayOf(true, false, true) var char_array1: Array = arrayOf('a', 'b', 'c') var string_array: Array = arrayOf("Hello", "World", "!")

通过上述两种方式对比可以看出,第2种初始化方式更加简单,在实际开发中可以根据个人喜好选择初始化方式。

值得一提的是,在初始化数组类型的变量时,变量的数据类型同样可以省略,例如“var string_array=arrayOf("Hello","World","!")”。2.3 运算符

在Kotlin程序中经常会出现一些特殊的符号,如+、-、*、=、>等,这些特殊符号称作运算符。运算符用于对数据进行算术运算、赋值运算和比较运算等操作。在Kotlin中,运算符可分为算术运算符、赋值运算符、比较运算符和逻辑运算符。2.3.1 算术运算符

在数学运算中最常见的就是加减乘除,被称作四则运算。Kotlin中的算术运算符就是用来处理四则运算的符号,这是最简单、最常用的运算符号。下面列举Kotlin中的算术运算符及其用法,如表2-2所示。表2-2 算术运算符

算术运算符看上去都比较简单,也很容易理解,但在实际使用时还有很多需要注意的问题,具体如下。(1)在进行除法运算时,当除数和被除数都为整数时,得到的结果也是一个整数,如果除法运算中有小数参与,得到的结果会是一个小数。例如,3/2属于整数之间相除,会忽略小数部分,得到的结果是1,而1.0/2的结果为0.5。

请思考一下下面表达式的结果是多少? 1500/1000*1000

结果为1000。由于表达式的执行顺序是从左到右,所以先执行除法运算1500/1000,得到的结果为1,再乘以1000,得到的结果自然就是1000了。(2)在进行取模(%)运算时,运算结果的正负取决于被模数(%左边的数)的符号,与模数(%右边的数)的符号无关。例如(-1)%2=-1,而1%(-2)=1。(3)在进行自增“++”和自减“--”的运算时,如果运算符“++”或“--”放在操作数的前面则是先进行自增或自减运算,再进行其他运算。反之,如果运算符放在操作数的后面则是先进行其他运算再进行自增或自减运算。

请仔细阅读下面的代码块,思考运行结果。var a: Int = 1 var b: Int = 2 var c: Int = a + b++ println("b=" + b) println("c=" + c)

在上述代码中,定义了3个Int类型的变量a、b、c。其中a=1、b=2。当进行“a+b++”运算时,由于运算符“++”写在了变量b的后面,属于先运算再自增,因此变量b在参与加法运算时其值仍然为2,c的值应为3。变量b在参与运算之后会进行自增,因此b的最终值为3。2.3.2 赋值运算符

赋值运算符的作用就是将数值、变量或表达式的值赋给某一个变量。接下来列举Kotlin中的赋值运算符及其用法,如表2-3所示。表2-3 赋值运算符

在赋值过程中,运算顺序从右往左,将右边表达式的结果赋值给左边的变量。在赋值运算符的使用中需要注意的是,除了“=”之外,其余的都是特殊的赋值运算符。以“+=”为例,a+=5就相当于a=a+5,首先会进行加法运算a+5,再将运算结果赋值给变量a。“-=”“*=”“/=”“%=”赋值运算符都可以以此类推。2.3.3 比较运算符

比较运算符用于对两个数值、变量或者表达式进行比较,其结果是一个布尔值,即true或false,接下来列举Kotlin中的比较运算符及其用法,如表2-4所示。表2-4 比较运算符

需要注意的是,在使用比较运算符时,不能将比较运算符“==”误写成赋值运算符“=”。2.3.4 逻辑运算符

逻辑运算符是对布尔型的数据进行操作,其结果仍是一个布尔类型数据。接下来列举Kotlin中的逻辑运算符及其用法,如表2-5所示。表2-5 逻辑运算符

在使用逻辑运算符的过程中,需要注意以下几个细节。(1)逻辑运算符可以针对结果为布尔值的表达式进行运算,如a<5&&b!=3。(2)运算符&&表示与操作,当且仅当运算符两边的表达式都为true时,其结果才为true,否则结果为false。当运算符左边的表达式为false时,运算符右边的表达式不会进行运算,结果为false,因此&&被称作短路与。(3)运算符||表示或操作,当运算符两边的操作数任何一边的值为true时,其结果都为true,当两边的值都为false时,其结果才为false。同与操作类似,||表示短路或,当运算符||的左边为true时,右边的表达式不会进行运算,结果为true。2.4 字符串

Kotlin语言相对于Java语言在字符串上做了一些增强,字符串也是一种数据类型,在这里单独作为一个小节进行详细讲解。2.4.1 字符串的定义

字符串表示一串连续的字符,在Kotlin中用String表示一个字符串时,需要用一对英文半角格式的双引号""引起来。一个字符串可以包含一个或者多个字符,也可以不包含任何字符,即长度为0。字符串的定义方式如下:var str: String = "Hello World!" //第1 种定义方式 var str = "Hello World!" //第2 种定义方式

字符串是不可变的,字符串中的元素可以使用索引的形式进行访问:即“变量名+角标”的形式,如str[i];也可以用for循环遍历字符串,具体代码如【文件2-1】所示。【文件2-1】ErgodicString.kt 1 package com.itheima.chapter02.string 2 fun main(args: Array) { 3 var str = "Hello World!" 4 // 获取字符串长度 5 println(str.length) 6 // 通过索引方式访问某个字符,角标从0 开始 7 println(str[4]) 8 // 通过for 循环迭代字符串 9 for (c in str) { 10 print(c) 11 } 12 }

运行结果:

12

o

Hello World!

值得一提的是,上述代码中for循环语句主要用于遍历集合中的元素,for关键字后边()中包括了3部分内容,分别是循环对象、in和循环集合,{}中的执行语句为循环体。在此只需了解即可,后面的章节会详细讲解。2.4.2 字符串的常见操作

在Kotlin程序中,字符串的常见操作除了遍历以外,还有字符串查找、字符串截取、字符串替换、字符串分隔、字符串去空格、字符串字面值、字符串模板等,接下来针对这几个操作进行详细的讲解。

1. 字符串查找

在Kotlin中,为了方便字符串的查找,提供了多个函数,如first()、last()、get(index),分别用于查找字符串中的第1个元素、最后1个元素以及角标为index的元素,具体代码如【文件2-2】所示。【文件2-2】StringSearch.kt 1 package com.itheima.chapter02.string 2 fun main(args: Array) { 3 var str = "Hello World!" 4 println(str.first()) // 获取第1个元素 5 println(str.last()) //获取最后1个元素 6 println(str.get(4)) //获取第5个元素 7 println(str[4]) //获取第5个元素 8 println(str.indexOf('o')) //查找字符串在原字符串中第1次出现的角标 9 println(str.lastIndexOf('o')) //查找字符串在原字符串中最后1次出现的角标 10 }

运行结果:

H

!

o

o

4

7

2. 字符串截取

在Kotlin中,字符串截取主要使用的是subString()函数和subSequence()函数,这两个函数都有重载函数(函数名相同,参数不同),如表2-6所示。表2-6 字符串截取

接下来通过一段示例代码演示上述方法的使用,具体代码如【文件2-3】所示。【文件2-3】SubString.kt 1 package com.itheima.chapter02.string 2 fun main(args: Array) { 3 var str = "Hello World!" 4 println(str.substring(3)) // 截取角标为3,到角标结束的字符 5 println(str.substring(3, 7)) // 截取角标为3,到角标为 6 的字符 6 println(str.substring(IntRange(3, 7))) // 截取角标为3,到角标为 7 的字符 7 println(str.subSequence(3, 7)) // 截取角标为3,到角标为 6 的字符 8 println(str.subSequence(IntRange(3, 7))) // 截取角标为3,到角标为 7 的字符 9 }

运行结果:

lo World!

lo W

lo Wo

lo W

lo Wo

3. 字符串替换

在Kotlin中,除了可以使用Java中的replace()函数实现字符串的替换之外,还可以使用replaceFirst()、replaceAfter()、replaceBefore()等函数用于字符串的替换,如表2-7所示。表2-7 字符串替换

接下来通过一段示例代码演示上述方法的使用,具体代码如【文件2-4】所示。【文件2-4】RepString.kt 1 package com.itheima.chapter02.string 2 fun main(args: Array) { 3 var str = "Hello World! Hello World!" 4 println(str.replace("World", "Kotlin")) 5 println(str.replaceFirst("World", "Kotlin")) 6 println(str.replaceBefore("!", "Kotlin")) 7 println(str.replaceAfter("Hello ", "Kotlin!")) 8 }

运行结果:

Hello Kotlin! Hello Kotlin!

Hello Kotlin! Hello World!

Kotlin! Hello World!

Hello Kotlin!

4. 字符串分隔

与Java语言类似,Kotlin语言中的字符串分隔也是调用split()函数进行的,接下来在一个例子中通过调用split()函数进行字符串分隔,具体代码如【文件2-5】所示。【文件2-5】SplitString1.kt 1 package com.itheima.chapter02.string 2 fun main(args: Array) { 3 val str = "hello.kotlin" //字符串 4 val split = str.split(".") //根据点号进行拆分 5 print(split) //打印拆分结果 6 }

运行结果:

[hello, kotlin]

从运行结果可以看出,“hello.kotlin”字符串已经被拆分为两个字符串,分别为“hello”和“kotlin”。在Kotlin中,split()函数还可以传入多个拆分符,多个拆分符中间只需用逗号分隔即可。具体代码如【文件2-6】所示。【文件2-6】SplitString2.kt 1 package com.itheima.chapter02.string 2 fun main(args: Array) { 3 var str="hello.kotlin/world" 4 var split=str.split(".","/") 5 println(split) 6 }

运行结果:

[hello, kotlin, world]

5. 字符串去空格

在实际操作中,经常需要删除字符串中的空格,为此Kotlin提供了trim()、trimEnd()等多个函数,其中trim()用于删除字符串前面的空格,trimEnd()用于删除字符串后面的字符。具体代码如【文件2-7】所示。【文件2-7】TrimString.kt 1 package com.itheima.chapter02.string 2 fun main(args: Array) { 3 var str = " Hello World! " 4 println(str.trim()) 5 println(str.trimEnd()) 6 }

运行结果:

Hello World!

Hello World!

从运行结果可以看出,trim()函数已经将字符串前面的空格删除,trimEnd()函数已经将字符串后面的空格删除。

6. 字符串字面值

字符串的字面值是一串字符常量,字符串字面值常量是用双引号括起来""的零个或多个字符,如“hello”。Kotlin中有两种类型的字符串字面值,一种是转义字符串,可以包含转义字符,另一种是原生字符串,可以包含转义字符、换行和任意文本。(1)转义字符串

转义是采用传统的反斜杠“\”方式将字符进行转义。Kotlin中的转义字符串与Java中的转义字符串类似,字符串在输出时,如果想要输出一些特殊字符,则需要用到转义字符串,比如\t,\b,\n,\r,\',\",\\和\$。在这里以\n(换行符)为例,具体代码如【文件2-8】所示。【文件2-8】EscapeString.kt 1 package com.itheima.chapter02.string 2 fun main(args: Array) { 3 // 字符串中包含转义字符 4 val str = " 您\n好" 5 println(str) 6 }

运行结果:

从运行结果可以看出,转义字符串在输出时,并不是保持字符串中原有内容输出,而是输出转义后的内容。

多学一招:反斜杠(\)

反斜杠(\)是一个特殊的字符,被称为转义字符,它的作用是用来转义后面的一个字符。转义后的字符通常用于表示一个不可见的字符或具有特殊含义的字符,例如换行(\n)。下面列出一些常见的转义字符。

• \r:表示回车符,将光标定位到当前行的开头,不会跳到下一行。

• \n:表示换行符,换到下一行开头。

• \t:表示制表符,将光标移动到下一个制表符的位置,类似在文档中用Tab键的效果。

• \b:表示退格符号,类似键盘上的Backspace键。

• \':表示单引号字符,在Kotlin代码中单引号表示字符的开始和结束,如果直接写单引号字符('),程序会认为前两个是一对,会报错,因此需要使用转义字符(\')。

• \":表示双引号字符,Kotlin中双引号表示字符串的开始和结束,包含在字符串中的双引号需要转义,比如""。

• \\:表示反斜杠字符,由于在Kotlin代码中的反斜杠(\)是转义字符,因此需要表示字面意义上的\,就需要使用双反斜杠(\\)。(2)原生字符串

原生字符串是使用3对引号("""""")把所有字符括起来,原生字符串可以有效地保证字符串中原有内容的输出,即使原生字符串中包含转义字符也不会被转义,具体代码如【文件2-9】所示。【文件2-9】NativeString.kt 1 package com.itheima.chapter02.string 2 fun main(args: Array) { 3 // 转义字符串 4 val str1 = " 您\n好" 5 println(str1) 6 // 原生字符串 7 val str2 = """ 您 \n 好""" 8 println(str2) 9 }

运行结果:

您\n好

从运行结果对比可以看出,在转义字符串中,会执行换行操作,而在原生字符串中,即使包含转义字符也并不执行转义操作。

7. 模板表达式

字符串可以包含模板表达式。所谓的模板表达式就是在字符串中添加占位符,字符串模板表达式由${变量名/函数/表达式}组成,也可以省略{},例如“$变量名”。接下来介绍一下字符串模板表达式的几种使用方式。(1)在字符串中,使用模板表达式存储字符串的值,具体代码

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载