本文将伴随大家进入Kotlin语言的正式学习生涯中,希望大家不要半途而废哦!笔者将Kotlin用于Android开发中,因此将从Android开发的视角叙述相关内容,同时将与Java语言有所联系。
1. 正式进入开发的准备知识
1.1 声明包名及导入包
包,含义、关键字、使用方式与Java一致,如在包com.my.demo下,导入包android.os.Bundle,代码如下:
1 | //源文件顶部 |
1.2 程序入口
每个程序都需要一个入口,一个main函数是必不可少的。当然,在Android开发中不需要main函数,而是由系统调用Application和Activity来触发程序的入口。Kotlin的main函数较为简单,代码如下:
1 | //fun关键字声明一个函数/方法 |
1.3 行注释及块注释
在前面的代码中,我用到了许多注释,用来解释说明我写的代码。日常开发中,注释是很有必要的,代码将被你逐渐遗忘,原本的含义也许不易通过代码去理解,良好的注释不仅方便了自己也帮助了别人。在我们的代码中,注释有两种,行注释与块注释,Kotlin中的注释与Java类似,代码示例如下:
1 | //这是一条行注释 |
1.4 代码风格
Kotlin的代码风格类似多种语言的结合体,可以看到很多Java、C#、C++等语言的影子,官方有提供代码风格指南:
应用风格指南
如需根据本风格指南配置 IntelliJ 格式化程序,请安装 Kotlin 插件 1.2.20 或更高版本,转到 Settings | Editor | Code Style | Kotlin,点击右上角的 Set from… 链接,并从菜单中选择 Predefined style | Kotlin style guide。
如需验证代码已按风格指南格式化,请转到探查设置(Inspections)并启用 Kotlin | Style issues | File is not formatted according to project settings 探查项。 验证风格指南中描述的其他问题(如命名约定)的附加探查项默认已启用。
包名采用全小写字母(例:package com.my.demopackage
),类名采用首字母大写的驼峰式命名(例:class SplahActivity{}
),函数名及变量名采用首字母小写的驼峰式命名(例:fun doSomething(){}
),常量名采用大写字母与下划线结合的方式(例:const val MAX_COUNT = 8
)。
Kotlin语句末尾无需;
标识,因此换行是代表语句结束还是未完待续就需要我们仔细观察了。其他一些不影响代码运行的风格就不一一例举了,可以参考官方文档,希望大家好好写代码,不只是关注于功能、性能,还要注意代码的可读性,写出漂亮的代码!
1.5 是否需要取代findViewById()方法
Kotlin在Android开发中有一个自动绑定View控件的特性,很多人都推崇取代findViewById()方法,但在使用中发现,这个特性的适用性不高。
Kotlin可以直接在代码中通过id来使用View控件,如:在SplashActivity的布局activity_splash_layout.xml中,存在一个id为tv_hello_world的TextView,那么在SplashActivity的onCreate()方法中可以使用语句tv_hello_world.setText("Hello World!")
,无需提前声明一个TextView变量,再经过findViewById()来绑定控件。
但如果是需要同一个类配合多个布局,且布局中存在相同id的控件时,此特性将无法使用;或是ListView、RecyclerView中存在多个Item类型对应不同布局,且布局中存在相同id控件的情况,此特性也无法使用。
此特性还存在可读性问题,布局中id均使用小写字母与下划线结合的方式命名,在类文件中直接当作变量使用,违背了变量采用驼峰式命名的代码风格,并且找不到该变量的声明,使得代码逻辑不易于理解。
综述,个人意见为尽量还是使用findViewById()方法,毕竟我们的代码不能只想着省事。
2. 基本语法结构
2.1 函数
函数的声明关键字是fun
,结束语句是return some
,空返回值类型是Unit
,返回值类型为Unit
时结束语句是return
且返回值声明及结束语句都可以省略。基本结构是fun 方法名(入参1名: 入参1类型, 入参2名: 入参2类型): 返回值类型{ 方法体 }
,代码示例如下:
1 | //带有两个 Int 参数、返回 Int 的函数 |
2.2 变量
变量的声明关键字有两个,var
和val
,其中val
修饰的变量只能被赋值一次,类似Java中被final
修饰的变量。一个变量的声明基本结构是var/val 变量名: 变量类型
,声明语句后可直接跟= 值
进行初始赋值并且此时能够自动推断变量类型(可省略: 变量类型
),代码示例如下:
1 | //定义只读局部变量使用关键字 val 定义,只能为其赋值一次 |
2.3 字符串模板
在Java中,字符串要拼接上变量值或是方法的返回值比较不友好,要么用+
连接,要么就得使用String.format()
方法。在Kotlin中可以在字符串中使用$变量名
或是${表达式}
的方式在字符串中插入变量或是表达式,代码示例如下:
1 | var a = 1 |
2.4 空值与Null检测
Kotlin著名的空安全使用起来还是很烧脑的,变量默认是不会为空的,未赋值的变量在编译中是会报错的,当某个变量的值可以为null
的时候,必须在声明处的类型后添加?
来标识该引用可为空,但在使用时就需要进行判空操作了。具体的空安全可以看官方文档,这里就先简单说一下,以后可能会单独写一篇空安全的分析。代码示例如下:
1 | //如果 str 的内容不是数字返回 null |
2.5 类型检测与自动类型转换
Kotlin这一特性用起来相当舒服,is
运算符检测一个表达式是否某类型的一个实例,如果一个不可变的局部变量或属性已经判断出为某类型,那么检测后的分支中可以直接当作该类型使用,无需显式转换,代码示例如下:
1 | fun getStringLength(obj: Any): Int? { |
2.6 条件表达式
if
语句在Kotlin中基本与Java一致,唯一的不同点在于最后一行代码若是单独的值,将作为if
语句的返回值,这一特点用来取代了Java中的a? b : c
三元表达式,示例代码如下:
1 | fun maxOf(a: Int, b: Int): Int { |
2.7 循环表达式
2.7.1 for 循环
Kotlin中的for
循环有点像Java中的foreach
语句,基本结构为for (对象 in 列表/数组/区间) { 循环体 }
,代码示例如下:
1 | val items = listOf("apple", "banana", "kiwifruit") |
2.7.2 while 循环
Kotlin中的while
循环与Java一致,基本结构为while (循环条件) { 循环体 }
,代码示例如下:
1 | val items = listOf("apple", "banana", "kiwifruit") |
2.8 when 表达式
when
表达式类似Java中的switch
语句,但是比switch
更高级,能够完全取代多个elseif
的情况,基本结构为when (变量) { 条件 -> 操作 }
,示例代码如下:
1 | //基本使用,类似switch |
2.9 区间
区间这个概念类似于数学中的区间(适用于整数,假设有整数a和b,a<b),形式有三种:
a..b
,即从a到b之间的所有整数的升序排列,包括a和b,相当于数学中的[a,b]
;b downTo a
,即从a到b之间的所有整数的降序排列,包括a和b,可以理解成[b,a]
;a until b
,即从a到b之间的所有整数的升序排列,包括a但不包括b,相当于数学中的[a,b)
。
同时,还可以在末尾加上step 整数
来指定步长,例如1..5 step 2
代表数列{1, 3, 5}
。区间一般用于for
循环,代码示例如下:
1 | for (i in 1..4) print(i) |
2.10 创建实例
实例的创建,没有关键字的标识,就像函数的调用。常用操作是声明一个变量,赋值为某个对象实例,调用其构造方法,例如val rectangle = Rectangle(5.0, 2.0)
,相对于Java来说,省略了new
关键字,就像调用了一个返回值类型为Rectangle的方法。