Kotlin学习笔记3-11 类和对象-对象
2018-01-31 14:17
465 查看
对象表达式和对象声明
Kotlin官网:Classes and Objects-Objects对于需要微调一些类,无需继承,类似于Java中的匿名内部类,Kotlin提供对象表达式和对象声明的形式。
对象表达式
创建一个继承一个或多个类的匿名类对象:window.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { // ... } override fun mouseEntered(e: MouseEvent) { // ... } })
继承有构造函数的类,必须选择一个调用;
继承多个类使用逗号分隔:
open class A(x: Int) { public open val y: Int = x } interface B {...} val ab: A = object : A(1), B { override val y = 15 }
对于仅声明一个对象,不继承其他类的情况:
fun foo() { val adHoc = object { var x: Int = 0 var y: Int = 0 } print(adHoc.x + adHoc.y) }
匿名对象只在局部(local)和内部(private)有效。在外部使用,例如作为方法的返回值或是public成员,只能作为父类被使用,没有显式声明的为Any。在匿名对象中添加的成员无法被访问到的。
class C { // 私有成员,返回类型为匿名对象的实例 private fun foo() = object { val x: String = "x" } // 公开成员,返回类型为对象表达式的父类,此处没有声明,默认为Any fun publicFoo() = object { val x: String = "x" } fun bar() { val x1 = foo().x // 可以访问到对象表达式的成员 val x2 = publicFoo().x // 由于公开的函数返回类型为Any,无法访问到对象表达式的成员 } }
类似于Java中匿名内部类可以访问外部成员,Kotlin的对象表达式也可以访问外部作用域中的成员,而且不受“必须final”的限制。
fun countClicks(window: JComponent) { var clickCount = 0 var enterCount = 0 window.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { clickCount++ //外部成员不要求为final } override fun mouseEntered(e: MouseEvent) { enterCount++ } }) // ... }
对象声明
Kotlin中可以使用对象声明的方式轻松实现单例模式:object DataProviderManager { fun registerDataProvider(provider: DataProvider) { // ... } val allDataProviders: Collection<DataProvider> get() = // ... }
对象声明的格式为
object+名字。
类似于变量声明,对象声明不是表达式,不能用来赋值(不能写在赋值语句右边)
使用对象声明:
DataProviderManager.registerDataProvider(...)
对象声明可以继承其他类:
object DefaultListener : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { // ... } override fun mouseEntered(e: MouseEvent) { // ... } }
注意:对象声明不能作为局部成员(例如写在函数内),可以嵌套在其他对象声明和非内部类(non-inner)中
伴生对象
使用companion关键字标记的对象声明
class MyClass { companion object Factory { fun create(): MyClass = MyClass() } }
调用伴生对象成员的格式和Java中调用静态成员的格式相同,类名.成员:
val instance = MyClass.create()
伴生对象的名字可以省略,此时为默认值”Companion”
class MyClass { companion object { } } val x = MyClass.Companion
伴生对象的使用格式和其他语言的静态成员使用格式类似,但是Kotlin中伴生对象是实例,伴生对象的成员都是实例成员,可以实现接口:
interface Factory<T> { fun create(): T } class MyClass { companion object : Factory<MyClass> { override fun create(): MyClass = MyClass() } }
在JVM上可以使用
@JvmStatic注解,使伴生对象成员生成为静态成员。详情见8-2Java中调用Kotlin
对象表达式和对象声明的区别
对象表达式是立刻执行的对象声明是延迟初始化的,在第一次被访问时初始化
伴生对象在类被加载时初始化(相当于Java的静态初始化)
相关文章推荐
- Asp.Net Ajax 学习笔记11 Microsoft AJAX Library中的面向对象类型系统
- Python Requests-学习笔记(11)-请求与响应对象
- JavaScript高级程序设计(第3版)学习笔记11 内建js对象
- 【学习笔记】C++primer plus 10. 11. 12. 对象
- Kotlin学习笔记3-9 类和对象-嵌套类
- Kotlin 学习笔记(八)—— Kotlin类与对象之接口
- JS 学习笔记--11---内置对象(Global/Math)
- JavaScript高级程序设计(第3版)学习笔记11——内建对象
- Chap 11 学习笔记-对象和结构化数据
- Kotlin学习笔记3-4 类和对象-访问限制
- Java学习笔记11(面向对象四:多态)
- 学习笔记11:Scala中伴生类和伴生对象中Apply方法的应用
- [Kotlin]Kotlin学习笔记(四):类与对象、泛型详解
- Scala学习笔记11【单例对象、伴生对象、Apply方法】
- JavaScript for Kids 学习笔记11. 面向对象
- 我的kotlin学习笔记(一)——对象
- 【学习笔记11】java面向对象-接口与类、接口与接口之间的关系
- Kotlin学习笔记3-3 类和对象-接口
- 11. JAVA常用类库 Part 4 (对象克隆技术clone、Arrays类、Comparable接口、比较器Comparator、观察者设计模式) ----- 学习笔记
- Kotlin学习笔记3-12 类和对象-委托