Android Studio创建kotlin项目
File->New->New Project->Include kotlin support
project build.gradle
app build.gradle
修饰符
类修饰符
Java的类和方法默认是open的,而kotlin中默认都是final的。如果创建一个类的子类,需要使用open修饰符来标示这个类,此外还需要给每一个可以被重写的属性或方法添加open修饰符。
修饰符 | 说明 |
---|---|
final | 不能被继承 |
open | 可以被继承 |
abstract | 抽象类 |
enum | 枚举类 |
data | 数据类 |
sealed | 密封类 |
annotation | 注解类 |
成员修饰符
|修饰符| 说明|
|-|-|
|override| 重写函数|
|open| 可被重写|
|final| 不能被重写|
|abstract| 抽象函数|
|iateinit| 后期初始化|
访问修饰符
修饰符 | 说明 |
---|---|
private | 私有 |
protected | 子类可见 |
internal | 在同一个模块(module)内可以访问 |
public | 任何地方可见 |
数据类型
定义变量关键字
定义变量关键字 | 说明 |
---|---|
var | 可变变量 |
val | 只读变量 创建的时必须初始化 |
Any类型是 Kotlin 中 所有非空类型(ex: String, Int) 的根类型
|
|
基本数据类型
基本数据类型 |
---|
Int |
Long |
Float |
Double |
Boolean |
Char |
String |
例子 定义变量
控制语句
|
|
基本数据类型转换
类型转换 |
---|
toInt |
toLong |
toFloat |
toDouble |
toChar |
toString |
toCharArray |
例子 变量转换
数组类型
数组类型 | 初始化方法 | 例子 |
---|---|---|
IntArray | intArrayOf | var i:IntArray=intArrayOf{1,2,3} 或者 var i:Array< Int>=arrayOf(1,2,3) |
LongArray | longArrayOf | 参考IntArray |
FloatArray | floatArrayOf | 参考IntArray |
DoubleArray | doubleArrayOf | 参考IntArray |
CharArray | charArrayOf | 参考IntArray |
BooleanArray | booleanArrayOf | 参考IntArray |
StringArray | 只能 var i:Array< String>=arrayOf(“2”,”2”,”2”) |
数组循环操作
|
|
函数运用
|
|
类和对象
get set
|
|
构造方法
|
|
伴生对象(静态方法静态成员)
|
|
继承
修饰符 | 说明 |
---|---|
private | 私有 |
protected | 子类可见 |
internal | 在同一个模块(module)内可以访问 |
public | 任何地方可见 |
变量、方法、类默认都是public,所以可以把public省略,Kotlin的类默认是不能继承的(即final类型),如果需要继承某类,该父类就应当声明为open类型。
抽象类
|
|
接口
|
|
接口代理
|
|
内部类
|
|
枚举
延迟加载
lateinit修饰变量var
lateinit不能对可空类型使用 例如Int 那些
不能拥有自定义 get set
在调用lateinit修饰的变量时,如果变量还没有初始化,则会抛出未初始化异常
|
|
lazy修饰常量val
lazy的加载时机为第一次调用常量的时候,且只会加载一次(毕竟是个常量,只能赋值一次)
|
|
拓展函数/属性
定义在类外部的类函数
拓展的方法和类的方法 重名同参数数量的话 优先度低不会执行拓展函数 拓展的方法能访问拓展类的成员
|
|
匿名函数
定义一个简单的函数可以用匿名函数
匿名函数,没有名称的函数,只定义参数列表、返回值类型和函数体
|
|
高阶函数
双冒号操作符 表示把一个方法当做一个参数,传递到另一个方法中进行使用,通俗的来讲就是引用一个方法。
为了防止作用域混淆 , :: 调用的函数如果是类的成员函数或者是扩展函数,必须使用限定符,比如this::方法名
将函数用作函数参数的情况
|
|
内联函数
文本替换,每个使用到的地方都会替换为内联函数。
内联函数是在编译期间起作用,还没到运行期间,不会造成函数调用的开销(开辟栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆 和c的内联一样
|
|
协程
|
|
启动一个协程可以使用 launch 或者 async 函数 async 函数相当于带执行结果的launch
runBlocking 创建的协程直接运行在当前线程上,同时阻塞当前线程直到结束
调度器
Dispatchers.Main:Android 中的主线程
Dispatchers.IO:针对磁盘和网络 IO 进行了优化,适合 IO 密集型的任务,比如:读写文件,操作数据库以及网络请求
Dispatchers.Default:适合 CPU 密集型的任务,比如计算
挂起函数
suspend关键字修饰的函数,我们称之为挂起函数。挂起函数只能从协程代码内部调用,普通的非协程的代码不能调用 ,挂起函数在执行完成之后,协程会重新切回它原先的线程。
|
|
父协程需要用到子协程的结果 有三种写法
|
|