〇、前言
在2017年的Google开发者大会上Google引入了新的Android开发语言Kotlin,2019年的开发者大会上Google 更进一步,宣布Kotlin Frist。伴随的Google的推动,这几年越来越多的Android开发从Java转为Kotlin,一些著名的三方库也在采用Kotlin重写。所以是时候总结一下Kotlin的学习笔记了,以期温故而知新。我的学习路线主要是按照《第三行代码》进行的的,所以笔记也以《第三行代码》为主。
一、面向对象
1.2构造函数:
构造函数:任何一个面向对象的编程语言都会有构造函数的概念,Kotlin中也有,但是Kotlin将构造函数分成了两种:主构造函数和次构造函数。
主构造函数:主构造函数的特点是没有函数体,直接定义在类名的后面即可。每个类默认都会有一个不带参数的主构造函数,当然也可以显式地给它指明参数。主构造函数将会是我们最常用的构造函数。
另外:所有主构造函数中的逻辑都可以写在init
结构体里面。
在主构造函数中声明成val
或者var
的参数将自动成为该类的字段,如果主构造函数中的参数前面不加任何关键字,它的作用域就仅限定在主构造函数当中。
次构造函数:次构造函数是通过constructor
关键字来定义的,是有函数体的。任何一个类只能有一个主构造函数,但是可以有多个次构造函数。次构造函数也可以用于实例化一个类,这一点和主构造函数没有什么不同。
Kotlin规定,当一个类既有主构造函数又有次构造函数时,所有的次构造函数都必须调用主构造函数(包括间接调用)。
Kotlin允许类中只有次构造函数,没有主构造函数。当一个类没有显式地定义主构造函数且定义了次构造函数时,它就是没有主构造函数的。
1.3继承:
- 在Kotlin中任何一个非抽象类默认都是不可以被继承的,相当于Java中给类声明了
final
关键字。(Effective Java这本书中明确提到,如果一个类不是专门为继承而设计的,那么就应该主动将它加上final
声明,禁止它可以被继承。)要让类可以被继承,在类的前面加上open
关键字即可; - 在Java中继承的关键字是
extends
,而在Kotlin中变成了一个冒号(:); - Java继承特性中子类的构造函数必须调用父类的构造函数,这个规定在Kotlin中也要遵守。Kotlin中子类的主构造函数调用父类中的哪个构造函数,在继承的时候通过括号来指定,即使在无参数的情况下,这对括号也不能省略;
1.4接口:
Java是单继承结构的语言,任何一个类最多只能继承一个父类,但是却可以实现任意多个接口,Kotlin也是如此;
Java中继承使用的关键字是extends
,实现接口使用的关键字是implements
,而Kotlin中统一使用冒号,中间用逗号进行分隔。另外接口的后面不用加上括号,因为它没有构造函数可以去调用;
Kotlin中使用override
关键字来重写父类或者实现接口中的函数;
同JDK 1.8一样,Kotlin允许对接口中定义的函数进行默认实现。如果接口中的一个函数拥有了函数体,这个函数体中的内容就是它的默认实现。默认实现函数子类可以自由选择实现或者不实现,不实现时就会自动使用默认的实现逻辑。
1.5函数的可见性修饰符
Java和Kotlin函数可见性修饰符对照表
修饰符 |
Java |
Kotlin |
---|---|---|
|
所有类可见 |
所有类可见(默认) |
|
当前类可见 |
当前类可见 |
|
当前类、子类、同一包路径下的类可见 |
当前类、子类可见 |
|
同一包路径下的类可见(默认) |
无 |
|
无 |
同一模块中的类可见 |
1.6数据类:
data:当在一个类前面声明了data
关键字时,就表明你希望这个类是一个数据类,Kotlin会根据主构造函数中的参数帮你将equals()
、hashCode()
、toString()
等方法自动生成。
1.7单例类:
虽然Java中的单例实现并不复杂,但是Kotlin做得更好,它将一些固定的、重复的逻辑实现隐藏了起来,只暴露给我们最简单方便的用法。在Kotlin中创建一个单例类的方式极其简单,只需要将class
关键字改成object
关键字即可。在Kotlin中我们不需要私有化构造函数,也不需要提供getInstance()
这样的静态方法,只需要把class
关键字改成object
关键字,一个单例类就创建完成了。
二、Lambda编程
Kotlin中的Lambda功能极为强大
2.1集合的创建:
listOf()
函数用来创建一个不可变的list
集合(只能用于读取,无法对集合进行添加、修改或删除操作),mutableListOf()
函数用来创建一个可变的list
集合;setOf()
函数用来创建一个不可变的set
集合,mutableSetOf()
函数用来创建一个可变的set
集合;mapOf()
函数用来创建一个不可变的map
集合,mutableMapOf()
函数)
函数用来创建一个可变的map
集合;- 在Kotlin中并不建议使用
put()
和get()
方法来对Map
进行添加和读取数据操作,而是更加推荐使用类似于数组下标的语法结构;
2.2集合的函数式API:
Lambda的定义:Lambda就是一小段可以作为参数传递的代码。
Lambda表达式的语法结构:{参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}