思维导图|kotlin 对象表达式和对象声明

大家好,我是青空。今天给大家带来的是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多份大厂面试题大全,我会持续更新中!公众号回复【面试题】即可获取。

图片

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值