Kotlin初体验之进阶一

  在关于Kotlin初体验中基础语法基本上已经介绍了一遍,这篇文章主要是对于Kotlin的一些特性的用法和理解算是补充和进阶吧。

Kotlin的修饰符:

Kotlin 的写法(默认为 public)       作用域:

public:                                            默认,总是可见

internal:                                          同模块可见

protected:                                       类似于private,但对子类也可见

private:                                           声明范围与同模块的子作用域可见


在Kotlin初体验中也提到过Kotlin的空安全,用操作符“?”来明确指定一个对象,或者一个属性变量是否可以为空。


@限定this:

@作为标记,可以作为跳出循环的break或return:

:: 操作符:

 表示把一个方法当做一个参数,传递到另一个方法中进行使用,通俗的来讲就是引用一个方法

需要注意test 函数的第三个参数传入 tests 时,要确定这个参数个数、类型、返回值都一致。

引用其他类中的方法只需要在::操作符前加上需要调用的方法的对象


集合:

Kotlin没有自己的集合API而是直接调用Java原有的集合,不过Kotlin优化了集合的操作

data关键字:

在kotlin中 data 修饰符 相当于 java中 public 、 getter 、 setter  、 toString 等的集合.

@JvmOverloads方法自动重载:

$符号在kotlin中表示引用某个参数,类似于java中的%s


扩展方法:

之前在初体验这篇文章提到过kotlin的一大特色扩展方法,拓展方法可以在任何地方为已有类进行方法的拓展,拓展之后的方法使用和原生方法一致。

引用一下官方描述:

Kotlin, similar to C# and Gosu, provides the ability to extend a class with new functionality without having to inherit from the class or use any type of design pattern such as Decorator. This is done via special declarations called extensions. Kotlin supports extension functions and extension properties.

意思就是Kotlin无需通过继承或装饰器模式,即可为特定类扩展出新的函数和属性.

举个例子以Toast为例,生成一个Toast需要我们传入三个参数,其中最关键的就是Context上下文对象,因为创建窗口需要建立在上下文的基础上才能完成,因此我们通常需要写一个Toast的工具来来方便我们使用,但是有了拓展方法之后就能在任意Context子类下直接调用我们拓展的方法。

在Java中”万物皆为对象“,所有的方法和属性都是基于类存在的,但是很多类都是封装好的,如果需要对它进行拓展的话就必须对它进行继承,这样会加大了我们的复杂性和耦合性.这就是Kotlin引入扩展方法的原因吧.

扩展方法实际上就是一个对应Java中的静态方法,这个静态方法参数为接收者类型的对象,然后利用这个对象就可以访问这个类中的成员属性和方法了,并且最后返回一个这个接收者类型对象本身。这样在外部感觉和使用类的成员函数是一样的。

扩展方法不能被重写

根据测试结果显示扩展方法并不是类的一部分,尽管子类和父类拥有了相同的扩展方法. 从测试来看,子类和父类拥有了相同的扩展方法,实际上就是定义两个同名的静态扩展方法分别传入父类和子类,那么调用的方法肯定也是父类中的方法和子类中的方法,所以输出肯定是父类的.
因为拓展方法的原理是基于静态函数的,所以不符合面向对象的规则。简单说就是,它不管最终生成的是什么对象,它只关心系统识别出来是什么对象,只会按照引用的类型来调用。

协程:

先简单介绍一下什么是协程,很多人对这个词很陌生.其实协程就是被认为可暂停计算的实例,即可以在某些点暂停并稍后可能在另一个线程上恢复执行的协程。协同程序相互呼叫(以及来回传递数据)可以形成协作式多任务处理的机制。

简单来说就是协程是一种“轻量级线程“,从Kotlin 1.1开始引入。由于一些耗时操作(如网络IO、文件 IO、CPUGPU密集型任务)会使线程阻塞直到操作完成,协程提供了一种避免线程阻塞、开销更小且更加可控的异步操作。

添加 dependencies :

示例:

咦launch、CommonPool、delay是啥??下面来解释一下:

launch

launch方法定义在kotlinx.coroutines.experimental

解释一下launch方法有3个参数:context(上下文)、start(启动选项)、block(真正要执行的代码块,必须是suspend修饰的方法)

launch方法返回一个Job,Job是协程创建的后台任务的概念,它持有该协程的引用。Job继承自CoroutineContext类型。一个Job有三种状态:

New 新建 (初始状态)

Active  活动中(默认状态)

Completed 已结束(最终状态)

很明显可以看出launch方法以非阻塞当前线程的方式,启动一个新的协程后台任务,并返回一个Job对象作为当前协程的引用。

CommonPool

CommonPool是共享线程池的意思,它的主要作用是来调度计算密集型任务的协程的执行。它的实现使用的是java.util.concurrent包下面的API。首先尝试创建一个java.util.concurrent.ForkJoinPool,如果不可用,就使用java.util.concurrent.Executors来创建一个普通的线程池:Executors.newFixedThreadPool.(ForkJoinPool是一个可以执行ForkJoinTask的ExcuteService,它采用了work-stealing模式:所有在池中的线程尝试去执行其他线程创建的任务,这样很更加高效);

delay

delay()方法相当于Thread.sleep()的功能,但是比它更好:它不会阻塞线程,而只是挂起协程本身.当协程在等待时,线程将返回到池中, 当等待完成时, 协同将在池中的空闲线程上恢复.

说到delay()这个方法就不能不提一下suspend关键字,在源码中可以看见delay()这个方法前面有个suspend关键字修饰,我们称之为挂起方法.挂起方法只能从协程代码内部调用,普通的非协程的代码不能调用.挂起方法只允许由协程或者另外一个挂起方法里面调用.


                                                                                                                    -----------------------------------------------------------------------------未完待续

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • Kotlin的类和接口与Java的类和接口是有一定的区别的。Kotlin的接口是可以包含属性声明。Kotlin默认...
    程自舟阅读 10,324评论 0 11
  • 面向对象编程(OOP) 在前面的章节中,我们学习了Kotlin的语言基础知识、类型系统、集合类以及泛型相关的知识。...
    Tenderness4阅读 4,426评论 1 6
  • 本文是在学习和使用kotlin时的一些总结与体会,一些代码示例来自于网络或Kotlin官方文档,持续更新... 对...
    竹尘居士阅读 3,272评论 0 8
  • 在Kotlin中创建集合 上一章我们已经使用setOf函数创建一个set了。同样的,我们也可以用类似的方法创建一个...
    4e70992f13e7阅读 6,502评论 0 4
  • 6.1【Day81 九命大头猫】 《明朝那些事儿3》 李贤的故事,这是一个电视剧人物呀!刚开始读到他怎么用计之时,...
    _原野阅读 93评论 0 0