为何要使用Callable来创建线程? 对一个变量n,初始化为0,我们使用实现Runnable接口的方式创建一个线程来对其进行一次n++操作,看看能得到我们预期的结果吗?...,这是因为main线程和t1线程是并发执行的,n在什么时候修改不清楚 我们使用线程通信的方式对上述代码进行改造来达到我们预期的结果 public class MyCallable { private...,结果符合我们预期的结果 ❗❗❗但是使用这种方式来达到我们预期结果,使用到了加锁释放锁,线程通信一系列操作,比较繁琐,所以我们需要使用Callable接口创建线程的方式来返回线程执行的结果 Callable...的使用方式 创建一个Callable(泛型)对象 ,重写带返回值的call方法 创建一个FutureTask任务对象task,参数传入创建的Callable对象 使用Thread创建线程,参数传入...的返回结果,因为Callable往往是在另一个线程中执行的,啥时候执行完并不清楚,所以需要使用FutuerTask来保存执行返回结果 Callable的使用实例 示例一:先对上述执行一次n++的操作代码使用
接口中需要实现的抽象方法iterator()的返回值会返回一个迭代器对象,这个迭代器对象可以作为一个工具来遍历集合类中的对象。...此外,迭代器更是设计模式,如对图的遍历可以实现一个图迭代器,简化代码,将遍历的思想抽象出来。 自己实现一个可以遍历上述单链表的迭代器,这个迭代器需要实现Iterator接口中的方法。...主要包括以下三个方法: (1)是否存在下一个对象元素 (2)返回下一个对象元素 (3)删除集合中的当前迭代器指向的对象元素 public class MyLinkedList ...while(it.hasNext()){ System.out.print(it.next()+" "); } } } 测试结果: 可以看出通过迭代器循环遍历集合中的对象元素和...show()方法的功能是相同的,但是迭代器为遍历集合对象元素提供了一种统一的方法,此外也可以使用迭代器做更多的事情。
号来引用 site.url 主构造器 主构造器中不能包含任何代码,初始化代码可以放在初始化代码段中,初始化代码段使用 init 关键字作为前缀。...抽象成员在类中不存在具体的实现。...Kotlin 接口与 Java 8 类似,使用 interface 关键字定义接口,允许方法有默认实现: interface MyInterface{ fun bar() fun foo...类委托 类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。...这经常出现在像解析 JSON 或者做其他"动态"事情的应用中。 在这种情况下,你可以使用映射实例自身作为委托来实现委托属性。 class Data(val map: Map<String, Any?
伴生对象的成员可通过只使用类名作为限定符来调用,伴生对象的成员看起来像 Java 的静态成员,在运行时他们仍然是真实对象的实例成员。...Kotlin: 因为在 Java 继承类和实现接口使用不同的关键字。 Swift: Swift 中继承类和实现协议也都是用同一个 : 符号。...在 Kotlin 中,如果一个类从它的直接超类继承相同成员的多个实现(由于接口函数可以有实现),它必须覆盖这个成员并提供其自己的实现。...声明一个抽象类,用 interface 关键字来定义接口,与 Java8 相似,接口中可以有函数的实现。...中,如果一个类从它的直接超类继承相同成员的多个实现(由于接口函数可以有实现),它必须覆盖这个成员并提供其自己的实现。
本章内容包括: 类和接口 非默认属性和构造方法 数据类 类委托 使用 object 关键字 1、定义类继承结构 /*--------------- 4.1.1 kotlin 中的接口...*/ // 代码清单 3 在接口定义一个带方法体的方法 // 代码清单 4 定义另一个实现了同样方法的接口 /** * 可以在接口中定义一个带方法体的方法...--*/ // 无论什么时候实现一个接口,你都可以使用by关键字将接口的实现 委托 到另一个对象。...使用 inner 关键字来存储外部类的引用。 sealed 类的子类只能嵌套在自身的声明中(Kotlin 1.1 允许将子类放置在同一文件的任意地方)。...伴生对象(与包级别函数和属性 起)替代了 Java 静态方法和字段定义 伴生对象与其他对象一样,可以实现接口,也可以拥有有扩展函数和属性 对象表达式是 Kotlin 中针对 Java 匿名内部类的替代品
Kotlin 和 Java 的方法引用使用::操作符,Kotlin 除了可以引用类中成员函数、扩展函数还可以引用顶层(top-level)函数。...: R ...... } 对于 KFunction 对象,也可以使用 KCallable 的call()方法来调用被引用的函数。...而 KFunctionN 的invoke()方法的形参类型和返回值类型是可以确定的,调用它的 invoke() 时编译器会帮我们做检查。 当然,也可以使用 KFunctionN 来引用类的扩展函数。...成员变量(包括从基类继承的、从接口实现的) public Field getField(String name) // 获取类自身声明全部的 public 成员变量(包括从基类继承的、从接口实现的)...Kotlin 使用类名::属性来获取成员属性的引用,并返回 KProperty1 类型的值。
前言 Java中的反射机制,使得我们可以在运行期获取Java类的字节码文件中的构造函数,成员变量,成员函数等信息。...//1.获取“名称是name”的public的成员变量(包括从基类继承的、从接口实现的所有public成员变量) public Field getField(String name) //2....获取全部的public成员变量(包括从基类继承的、从接口实现的所有public成员变量) public Field[] getFields() //3.获取“名称是name”,并且是类自身声明的成员变量...Kotlin中可以使用Java中的反射,但是由于Kotlin中字节码.class对应的是KClass类,所以如果想要使用Java中的反射,需要首先获取Class的实例,在Kotlin中可以通过以下两种方式来获取...当然Kotlin中除了可以使用Java中的反射以外,还可以使用Kotlin中声明的一些方法,当然同Java中反射一样,想要使用这些方法,先要获取Kclass对象,在Kotlin中可以通过以下两种方式获取
> b) a else b void 类型的函数在 Kotlin 中会以 Unit 的形式返回 Kotlin 的函数可以定义在任何地方:顶层、类的成员、函数中定义另一个函数 调用顶层函数相当于 Java...} 常用的集合操作 filter 只保留满足谓词条件的元素 map 将每一个元素按指定规则变换 any 判断列表中是否有满足谓词条件的元素 all 判断列表中是否所有元素都满足谓词条件 find 找第一个满足谓词条件的元素...equals,但是当类使用 data 修饰时,会自动实现一个比较域成员的 equals,于是就会得到 true Kotlin 只会使用主构造器中的属性来实现 equals,不会使用类在其他部分定义的变量...,可以使用 inner class A,并通过 @ 标签访问 class A { class B inner class C { this@A } } 类委托可以委托一个类来实现一个接口...equals() 访问键值对也可以使用 map[index] 操作,会调用 map.get(index) Java 的 String 没有实现 Iterable 接口,但是 Kotlin 中可以通过定义拓展函数的方法重载迭代运算符
Kotlin 的继承和接口实现语法基本上是一样的。 --- Kotlin 的接口,跟 Java 最大的差异就在于,接口的方法可以有默认实现,同时,它也可以有属性。...任何第三方提供的 SDK,我们都无权修改。 不过,借助 Kotlin 的扩展函数,我们就完全可以在语义层面,来为第三方 SDK 的类扩展新的成员方法和成员属性。...前面定义的 add 函数,赋值给另一个函数变量时,不能直接用的, 图片 需要使用::操作符 , 后跟要引用的函数名,获得函数引用后才可以去赋值。...使用 lambda 表达式可以替代手动创建 实现函数式接口的类。...--- Kotlin 中引入高阶函数会带来几个好处:一个是针对定义方,代码中减少了接口类的定义;另一个是对于调用方来说,代码也会更加简洁。
本章内容包括: Lambda 表达式和成员引用 以函数式风格使用集合 序列:惰性地执行集合操作 在 Kotlin中使用 Java 函数式接口 使用带接收者的 lambda 5.1 Lambda表达式和成员引用...) // 可以使用库函数 run 来运行传给它的lambda,运行lambda中的代码块 kotlin.run { println(66) } //...* 这个接口表示的就是一个可以逐个列举元素的元素序列。Sequence值提供一个方法,iterator,用来从序列中获取值。...) // 在Kotlin中可以调用它并把一个lambda作为实参传给它。...Kotlin 可以把 lambda 放在括号外传递给函数,而且可以用 it 引用单个的lambda 参数。 lambda 中的代码可以访问和修改包含这个 lambda 调用的函数中的变量。
在kotlin中可以使用::把函数转换成一个值,从而传递给函数。...() } all、any、count、find all与any用来检查集合中的所有元素是否都符合某个条件, all表示全部 && any表示至少有一个 count函数检查有多少个元素满足判断式 find...为了解决这个问题kotlin引入了 惰性集合:序列, 序列中的元素的求值是惰性的,不需要创建集合来保存中间结果,我们可以使用序列来解决上面的问题: peoples.asSequence().map{it.name...至于为什么将会在 Lambda的实现细节的讲到。 Lambda的实现细节 在kotlin中,每个函数式接口的lambda都会被编译成一个匿名类(除内联lambda)。...,作为参数的lambda表达式会被直接替换到最终生成的代码中,而不是被包含在一个实现了函数接口的匿名类中。
类的声明 和Java没有什么两样,Kotlin中,类的声明也使用class关键字,如果只是声明一个空类,Kotlin和Java没有任何区别,不过定义类的其他成员,区别就很大了。...当然Java可以直接使用public的成员变量来解决这个问题,但对于属性来说,不仅仅能读写其值,还需要对其进行二次加工,所以get/set也是必须的。...接口是另一个重要的面向对象元素,用于制定规范,强调对象是否具有某个功能。...Kotlin与Java类似,使用interface声明接口,一个类可以实现多个接口,实现的方法和类继承相同,而且,接口中的属性和方法都是open的。...:实现接口与继承父类类似,使用冒号(:),但后面不是调用构造方法,而是是指跟接口名;Kotlin中的接口的方法,允许包含默认方法体,对于这样的额方法,子类实现接口时不一定必须实现该方法。
03 更简洁的字符串 同Java一样,Kotlin也可以用字面量对字符串对象进行初始化,但Kotlin有个特别的地方是使用了三引号”””来方便长篇字符串的书写。而且这种方法还不需要使用转义符。...04 强大的when语句 Kotlin中没有switch操作符,而是使用when语句来替代。同样的,when 将它的参数和所有的分支条件顺序比较,直到某个分支满足条件。...同样的,委托也是一种设计模式,它的结构如下图所示: ? Kotlin在语言级别支持它,不需要任何样板代码。Kotlin可以使用by关键字把子类的所有公有成员都委托给指定对象来实现基类的接口: ?...上述代码中,Base是一个接口,BaseImpl是它的一个实现类,通过by b语句就可以把Derived类中的所有公有成员全部委托给b对象来实现。...Regex 三是使用实现函数类型接口的自定义类的实例 ?
因此,每一个对象包含两部分:成员变量和成员方法。在成员方法中可以改变成员变量的值。 2.程序是对象的集合,他们通过发送消息来告知彼此所要做的事情,也就是调用相应的成员函数。...每个对象能够接受的请求(消息)由对象的接口所定义,而在程序中必须由满足这些请求的代码,这段代码称之为这个接口的实现。...当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。...如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。 4.3.2 接口 接口是一种比抽象类更加抽象的“类”。接口本身代表的是一种“类型”的概念。...在Java 8 和Kotlin中,接口可以实现一些通用的方法。 接口是抽象类的延伸,Kotlin跟Java一样,不支持同时继承多个父类,也就是说继承只能存在一个父类(单继承)。
expected 声明指定了一个 API(类、接口、注释、顶层声明等)。actual 声明或是 API 的平台相关实现,或是在外部库中 API 现有实现的别名引用。...目标平台:运行 Kotlin 1.2.0 版本的 JVM 检查一个 lateinit 变量是否被初始化 现在可以在属性引用上使用 isInitialized 来检查 lateinit 变量是否已经被初始化...这也使得可调用的引用在你引用外部接收者的成员的 lambda 中更方便使用。...确保与新模块系统兼容的另一个更改是从 kotlin-reflect 库中移除 kotlin.reflect 包中的弃用声明。...Java 默认方法调用 在 Kotlin 1.2 之前,接口成员在使用 JVM 1.6 的情况下重写 Java 默认方法会在父调用中产生警告:Super calls to Java default methods
Kotlin 的另一个关键新特性是协程,它是一个轻量级的线程,一个线程中可以创建任意个协程,线程的执行和结束是由操作系统调度的,而协程可以让开发者手动控制其执行和结束。...在使用协程后,团队得以降低首页各个频道接口调用所需的资源,接口调用周期也更加可控。目前电信营业厅的首页和商城等核心页面都是通过 Kotlin 打造出流畅的使用体验。 ?...是时候看看远方的风景了 使用 Kotlin 带来的另一个好处,就是进入 Android 平台新功能的 "快车道"。...对那些流量敏感的用例,也可以直接使用 网络连接 API 来检测设备是否进行了高带宽连接,并能 检查连接是否计费。这时,开发团队大量使用了 Kotlin 的局部委托属性,使代码更加清晰明了。...在使用 Kotlin 前,首先要对项目组成员对 Kotlin 的熟悉程度做一个简单的评估。
expected 声明指定了一个 API(类、接口、注释、顶层声明等)。actual 声明或是 API 的平台相关实现,或是在外部库中 API 现有实现的别名引用。...例如,当作为构造函数参数传递给一个对象的 lambda 引用另一个对象时,稍后必须定义的对象可以使用: 循环中的值:1, 2, 3, 1, 2, 3, 1, ......目标平台:运行 Kotlin 1.2.0 版本的 JVM 检查一个 lateinit 变量是否被初始化 现在可以在属性引用上使用 isInitialized 来检查 lateinit 变量是否已经被初始化...这也使得可调用的引用在你引用外部接收者的成员的 lambda 中更方便使用。...Java 默认方法调用 在 Kotlin 1.2 之前,接口成员在使用 JVM 1.6 的情况下重写 Java 默认方法会在父调用中产生警告:Super calls to Java default methods
Kotlin 的另一个关键新特性是协程,它是一个轻量级的线程,一个线程中可以创建任意个协程,线程的执行和结束是由操作系统调度的,而协程可以让开发者手动控制其执行和结束。...在使用协程后,团队得以降低首页各个频道接口调用所需的资源,接口调用周期也更加可控。目前电信营业厅的首页和商城等核心页面都是通过 Kotlin 打造出流畅的使用体验。...是时候看看远方的风景了 使用 Kotlin 带来的另一个好处,就是进入 Android 平台新功能的 "快车道"。...对那些流量敏感的用例,也可以直接使用 网络连接 API 来检测设备是否进行了高带宽连接,并能 检查连接是否计费。这时,开发团队大量使用了 Kotlin 的局部委托属性,使代码更加清晰明了。...在使用 Kotlin 前,首先要对项目组成员对 Kotlin 的熟悉程度做一个简单的评估。
因此,每一个对象包含两部分:成员变量和成员方法。在成员方法中可以改变成员变量的值。 2.程序是对象的集合,他们通过发送消息来告知彼此所要做的事情,也就是调用相应的成员函数。...每个对象能够接受的请求(消息)由对象的接口所定义,而在程序中必须由满足这些请求的代码,这段代码称之为这个接口的实现。...它们不包含外部类的隐式引用。 在构造函数方面,Kotlin简短的主构造函数在大多数情况下都可以满足使用,当然如果有稍微复杂的初始化逻辑,我们也可以声明次级构造函数来完成。...如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。...7.4.3 覆盖冲突 在kotlin中, 实现继承通常遵循如下规则:如果一个类从它的直接父类继承了同一个函数的多个实现,那么它必须重写这个函数并且提供自己的实现(或许只是直接用了继承来的实现) 为表示使用父类中提供的方法我们用
抽象类与接口的共性 比较抽象,不能直接实例化 有需要子类(实现类) 实现的方法 父类 (接口) 变量可以接受子类 (实现类) 的实例赋值 5....抽象类和接口的区别 抽象类有状态,接口没有状态 抽象类有方法实现,接口只能有无状态的默认实现 抽象类只能单继承,接口可以多实现 抽象类反映本质,接口体现能力 继承 父类需要open 才可以被继承 父类方法...每个类可以对应一个伴生对象 伴生对象的成员全局独一份(对于类来说) 伴生对象的成员类似 Java 的静态成员 在Kotlin中,静态成员考虑用包级函数,包级变量替代 JvmField 和 JvmStatic...对于某些传值比较固定的参数,偏函数可以将其绑定,然后生成新的函数,而新的函数只需要给除已绑定的参数之外的参数传值,当然你也可以视同 默认参数+具名参数 的方式来实现参数的固定,如果需要固定的参数在中间...您可以使用Nothing来表示“一个永不存在的值”:例如,*如果函数的返回类型为Nothing,则表示该函数永不返回(总是引发异常)。
领取专属 10元无门槛券
手把手带您无忧上云