大家好,我是青空。今天给大家带来的是kotlin 对象表达式和对象声明。
文末可领取大厂面试题
作用
创建一个对某个类做了轻微改动的类的对象
且不需要去声明一个新的子类
对象表达式
通过匿名内部类
-
或继承、或实现
-
或通过构造函数传值给其参数
匿名对象只在本地和私有作用域中声明
范例
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { /*……*/ }
override fun mouseEntered(e: MouseEvent) { /*……*/ }
})
知识点复习
-
object与any的区别
-
any
-
定义的方法有:toString()、equals()、hashCode() 3个
-
Object类
-
定义的方法有:toString()、equals()、hashCode()、getClass()、clone()、finalize()、notify()、notifyAll()、wait()、wait(long)、wait(long,int) 11个
-
Kotlin compiler treats kotlin.Any and java.lang.Object as two different types, but at runtime they are represented with the same java.lang.Object class.
解析
-
object:MouseAdapter即是new MouseAdapter()
-
如果不需要 super继承,仅需要一个object怎么写呢
private fun foo() = object {
val x: String = "x"
}
把冒号 后面的去掉
范例
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 // 错误:未能解析的引用“x”
}
}
-
注意
-
留意上述范例中的 注释部分
-
private函数,会返回 匿名对象类型
-
非private函数,返回的是Any类型
对象声明
Kotlin 使用 object 关键字来声明一个对象
通过对象声明
可以获得一个单例
范例
object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
// ……
}
val allDataProviders: Collection<DataProvider>
get() = // ……
}
这就是对象声明 仿佛是你声明了一个变量一样
DataProviderManager.registerDataProvider(……)
var data1 = DataProviderManager
var data2 = DataProviderManager
data1.name = "test"
print("data1 name = ${data2.name}")
//注意这里data1.name 和data2.name是一样的
object声明的单例,只能通过类名来访问!!!
Kotlin的单例,避免了getInstance,直接调用。
砍砍砍,砍代码量啊
看个范例
class Engineer {
var name = "wangxueming"
object Info {
var sex = "man"
fun showName(){
print{"desk legs $name"} // 错误,不能访问到外部类的方法和变量
}
}
}
fun main(args: Array<String>) {
var wxm = Engineer()
wxm.Info.sex // 错误,不能通过外部类的实例访问到该对象
Engineer.Info.sex // 正确
}
伴生对象
用 companion 关键字标记 与外部类关联在一起!!!
如影随形
可以直接通过外部类访问到对象的内部元素
范例
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
}
val instance = MyClass.create() // 访问到对象的内部元素
也可以这样
class MyClass {
companion object {
}
}
val x = MyClass.Companion
-
注意
-
是 实例成员
-
伴生对象并不是静态成员
注意
-
一个class里面只能声明一个内部关联对象
-
即关键字 companion 只能使用一次
对象表达式和对象声明之间的语义差异
对象表达式是在使用他们的地方
- 立即执行的
对象声明是在第一次被访问到时
- 延迟初始化的
伴生对象的初始化
-
在相应的类被加载(解析)时
-
与 Java 静态初始化器的语义相匹配
最近又赶上跳槽的高峰期,好多粉丝,都问我有没有最新大厂面试题,我连日加班好多天,终于整理好了,1000+ 道,20多份大厂面试题大全,我会持续更新中!公众号回复【面试题】即可获取。