首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

kotlin学习笔记

前言

以前android的开发大部分使用java开发,而由于kotlin的推出,公司也开始转向了使用kotlin,所以在这里记录下学习kotlin的笔记.

基本语法

基本类型

在kotlin中没有基本类型,其中一切都是对象,这也导致了其没有自动转换类型的功能,如folat不会自动上转为double之类的,而在java的基础类型之间转换需要调用其中的方法,虽然在本文中,多出地方使用了关键字,但其也是一个对象,只是作者沿用了java的说法.

定义包和导入包

这个与java的使用时一样的

定义函数

kotlin中的函数使用fun作为关键字来定义,返回值在函数参数声明后使用":"冒号来定义返回值类型,当然也可以让其自动判断返回类型,返回参数也使用return返回

kt中无返回值(返回无意义的值),也就是java中的void,其使用关键字Unit,当然这个关键字一般是可以省略的,如下两个函数,其返回值是Unit(无返回值)

kotlin的函数可以使用参数默认值,这是java所不支持的,其使用与C++的默认参数类似,但也有点不同

这里有个小扩展,在C++中的默认参数一定要放在函数参数列表的后面,否则会报错,但kotlin这样用却不会报错,个人认为将默认参数放在中间这是一个意义不大的事情

可变长度的参数

在java中可以使用...来表示函数传入的参数长度不固定,而kotlin中也有这功能,但不是...,而是vararg关键字

局部函数

kotlin中有局部函数,从名字看,就是函数中的函数

局部参数定义

val定义的只能赋值一次,类似于java的final;var定义可变类型,类似java定义的普通变量;两种定义的使用方式基本类型,其不同之处只是在定以后val的参数不可以再次赋值,而var可以

其中可以使用as关键字类转换类型,父子类的转换或强制转换

字符串模板

kt可使用"公式输入有误"xxx的结果转换为字符串

if条件判断

kt中的if与java的用法类似,可以说java怎么用,kt就可以怎么用,但kt有更多的用法,如kt的if是可以用返回值的,在if的代码块的最后一句,如果为一个值,那么他就是if的返回值,这里需要注意的是,如果需要其有返回值,那每一个if条件的代码块的最后一行都需要是有一个同类型的值,否则无返回值

null可空值

在kt中,要是某个值可为null时,需要再声明的类型后面添加?,来表示该应用可以为空;

且在这个参数使用时加上?使用,可在其不为空时才调用,在为空时不调用;

使用!!来保证不为空时才调用,为空时抛出异常;

使用?:来给其在空时的默认值

类型检测及自动类型转换

kt中使用is关键字来检测类型,且检测后的分支中可以直接当该类型使用

for循环

kt中使用in关键字来循环遍历

区间

kotlin中有使用..来表示区间

迭代区间

while循环

这个与java 的一样使用

when表达式

类似于java 的swich,且when和if一样是有返回值的,返回值用法也和if的一样

当然when中可以不传参数,再不传的情况下,其分支条件需要为布尔值

异常

kotlin的异常与java 的类似,也是使用try-catch-finally,但其和if一样是一个表达式

==相等比较

在kotlin中==是使用equals()比较的,是数值相等,而在java中,若对对象使用==,则是比较引用相等

在kotlin中,如果需要比较其引用相等,需要使用===,三等号

定义类

属性

构造函数中声明了属性或类中声明的属性,会默认的有setter和getter方法,虽在在使用的时候像是直接在操作属性其实其是调用了对应的get和set方法,当然也可以修改默认的set和get方法

构造方法

一般来说,要使用主构造函数来实现,然后其他参数提供相应的默认值,来达到类似重载的功能

类继承

kotlin中的类只能继承显示声明为open或abstract的类,其中open是可被重写的意思,abstract是抽象的意思

向上面两个类的声明才可以被继承,继承时使用":"来继承,而不是java中的extends关键字

kotlin的方法默认是final,不可重写的,所以,如果需要可以重写就需要显示声名open,或设为abstract抽象方法,而继承后重写一定要使用override关键字,且override关键字默认为open,所以在重写后,若想此方法不可被重写就要显示的使用final,kotlin的final与java的类似

接口

接口的实现与继承一样,都是使用":",接口内的方法默认都为open,且无实现体就默认为abstract

kotlin的接口定义也是使用interface关键字,且支持在接口中提供默认实现

无默认方法的,其子类一定要实现这个方法,如有默认实现的,子类可以不是实现,默认使用接口中的是实现

这里可以看出继承和实现的不同,继承需要加上其构造方法,而实现不用

除了方法之外,kotlin的接口还支持默认属性,且kotlin的接口不存储属性值,只有其子类才会存储

可见性修饰符

在kotlin中有public/internal/protected/private,四种,默认为public,而java中默认为包私有,这和kotlin的不太一样,且kotlin没有包私有修饰符.protected与java的不同,只能是在本类和子类中可见,而kotlin转java是,internal会被转为public

修饰符 || 类成员 || 顶层声名

public(默认) || 所有地方可见 || 所有地方可见

internal || 模块中可见 || 模块中可见

protected || 子类可见 || 无此用法

private || 类中可见 || 文件中可见

data数据类

kotlin中提供了一个数据类,数据类中提供了equals/hashcode/toString方法的重写,还提供了copy方法来复制数据类,声名的关键字为data

enum枚举类

扩展函数

这个就厉害了,可以类以外的一个地方对类方法进行扩展,也可以说是给类添加一个函数,然后在其他地方使用到这个类时,可以直接调用这个方法使用,如对Context添加一个Toast的方法

需要注意的是,扩展函数无法使用被扩展类的protected和private修饰的属性或方法

//MainACtivity.kt

当然除了可以添加函数,也可以添加属性

需要注意的是,扩展函数不能被子类重写,因为扩展函数会被当做静态类型来处理,而且当扩展函数名和成员函数名一样是会优先使用成员函数名

内部类(嵌套类)

在java中的内部类,如不声名为静态的,其会持有外部类的引用,而声名了静态类型则不持有

而在kotlin中默认是不持有的(相当于静态),如果需要持有外部类引用则需要使用inner关键字

密封类

关键字sealed,使用sealed声名的类,默认为open,其子类只能在本类中继承在类外不可继承(在kotlin1.1版本改为在文件中)

kotlin基础之后的

协程

协程有个特点就是轻量级:

协程与线程类似,但是他比线程更加的轻量级,如开启1000个线程和1000个协程去执行一个工作,其中的开启线程就是开了1000个线程,这里是非常消耗资源的,而1000个协程,其中只是开了几个或几十个线程去工作.

协程的使用

使用协程需要导入一些包

kotlin的协程可使用async或launch来开启,两者功能类似,只是async默认是异步的,即不会立即运行,且两者的返回值不同,launch返回一个Job对象,async返回一个Deferred( -一个轻量级、非阻塞的 future),而Deferred内部是继承了Job所以两者之间的差异并不是很大

使用协程时,需要给其指定协程所执行的上下文或环境(也可以说是在哪个线程),而0.20版本中提供了以下的默认环境

正式使用协程

集合类

kotlin中使用的集合类是java的集合类,虽然如此,kotlin还为其添加了很多便于开发者操作的方法/函数

中缀调用

这个有一点点像C++中对运算符的重载的感觉,虽然表象上差距挺大的

像集合类中map中的to,这个就是个中缀调用,定义中缀调用函数的关键字是infix,他可以作用在普通函数(需要再一个类中的,顶层函数不可以)和扩展函数中且规定了其函数参数只能有一个,返回值可有可无

而kotlin中对Any提供了一个扩展函数to,其实现为

字符串处理

kotlin的字符串处理也是使用了java的字符串处理,只不过kotlin还为其添加了很多易用的扩展函数,如获取字符串第一个或最后一个字符的函数

类委托

kotlin中提供了类委托的操作,关键字为by,这委托是在实现一个接口时,将实现部分委托给一个属性,使得本类成为一个中转的类

单例

在kotlin中实现单例非常的方便,使用object关键字就可以实现

伴生对象

伴生对象有点像java的静态方法,但kotlin中没有static这东西,而代替他的是使用顶层函数,但是顶层函数无法访问类的private成员,所以这是就需要伴生对象了,其关键字为companion,一般会配合object使用

并且伴生对象也支持扩展函数,一般可以声名一个空的伴生对象,留给之后扩展

let函数

let函数有点像groovy的闭包,使用let后,可在{}中通过it或自定义为其他参数来使用调用者

lateinit 属性延时初始化

在使用lateinit可以声名一个不为空的属性,且声名时不初始化,在之后再初始化,这里的属性需要为var,如果为val的话就必须在构造函数中初始化

如果在初始化之前就调用了data,那么就会报错..

by lazy惰性初始化

这个与上面的latinit不太一样,by lazy()是在使用的时候在进行相关的初始化,且默认线程安全

Nothing类型

Nothing类型作为函数返回值,表示这个函数不会正常结束,也表明这个函数不会返回任何东西

运算符重载

kotlin的运算符重载与C++的类似,其关键字为operator,其可重载二元、一元、复合、比较运算符

二元

二元的有*/%+-运算

其对应的重载方法为

表达式 || 函数名

|| times

/ || div

% || mod

|| plus

|| minus

复合

复合的有+= -= *= /= %=

其重载的方法与其二元运算符差不多,在其基础上加上Assign即可,如+号为plusAssign,-号minusAssign

一元

一元的有++ -- + - !

其对应的重载方法为

表达式 || 函数名

+a || unaryPlus

-a || unaryMinus

!a || not

++a,a++ || inc

--a,a-- || dec

比较运算符

==为重写equals

其余的> = 小结

以上是前段时间学习kotlin的学习笔记,总的来说,kotlin使用上更加方便简洁,且内部已经提供了很多常用的操作如集合类的操作等等...

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180722G0LQNW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券