前言

本文我们需要了解几个点。
①object与any的区别?
②private跟非private返回值的区别?
③Kotlin中单例模式怎么实现?又如何调用?
④伴生对象什么时候产生?可以如何调用?
⑤对象表达式、声明对象、伴生对象 初始化的时机?

本节目录不重要。带着这些问题就可以了。


作用

Kotlin的对象表达式,再一次简化了,对某个类做轻微改动时,且不需要去声明一个新的子类。


对象表达式

通过匿名内部类

与java一样,或继承、或实现、或通过构造函数传值给其参数。

匿名对象只在本地和私有作用域中声明

范例一
window.addMouseListener(object : MouseAdapter() {override fun mouseClicked(e: MouseEvent) { /*……*/ }override fun mouseEntered(e: MouseEvent) { /*……*/ }
})

知识点复习

理解一下Kotlin中,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.

编译器认为Any和Object是不同的类型;但是在运行时,Any和Object表现出来是一样的。

这也是Kotlin可以和Java互通的一个提现。运行时,我们都一样的。

解析

  • object:MouseAdapter即是new MouseAdapter()
  • 如果不需要 super继承,仅需要一个object怎么写呢
     private fun foo() = object {val x: String = "x"}

把冒号 后面的去掉

范例二
class C {// 私有函数,所以其返回类型是匿名对象类型private fun foo() = object {val x: String = "x"}// 公有函数,所以其返回类型是 Anyfun 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(……)

单例的调用不用getInstance了。砍砍砍,砍代码量啊

来看范例一
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 // 正确
}

通过object声明的对象,是单例,而且!只能!通过 类名 范文。不得不说,这避免了不少麻烦事。
明摆的事情!我访问单例,肯定就是那么个实例。


伴生对象

用 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 静态初始化器的语义相匹配

小结

总体来说,在Kotlin中,通过object实现了单例,并简化了单例模式下实例的调用方式;
通过伴生对象,解决了部分的 初始化需求,但是,又在一些情况下,弱化伴生对象的存在(companion object修饰的类名可以不写)。

将减少代码量,作为最高意志。

Kotlin入门-带着问题,理解 对象表达式和对象声明相关推荐

  1. Kotlin学习笔记 第二章 类与对象 第十二 十三节 对象表达式与对象声明 类型别名

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  2. android对象申明,Kotlin中的对象表达式和对象声明的具体使用

    Kotlin的对象表达式与Java中的匿名内部类的主要区别:匿名内部类只能指定一个父类型,但对象表达式可以指定0~N个肤类型. 一.对象表达式 对象表达式的语法格式如下: object [: 0~N个 ...

  3. Kotlin学习笔记(六) 伴生对象 对象表达式

    2019独角兽企业重金招聘Python工程师标准>>> 一,伴生对象 1.类似于java中的静态方法static class TestCompanion{//伴生对象使用compan ...

  4. 阿里架构师开源《Kotlin入门教程指南》+《高级Kotlin强化实战》

    对于有Java基础的程序员来说,Kotlin是一门非常容易上手的编程语言,也是一门必须掌握的编程语言.Java代码在运行前需要编译生成一种特殊的class文件,然后Java虚拟机会识别并解释这些cla ...

  5. 零基础入门│带你理解Kubernetes

    条分缕析带你充分理解Kubernetes的各个细节与部分:它是什么,它如何解决 容器编排问题,它包含哪些你必须掌握的关键对象,以及如何快速上手部署使用Kubernetes. 容器的好处不胜枚举:一致的 ...

  6. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器及生成表达式...

    复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象---->  延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...

  7. Kotlin入门(18)利用单例对象获取时间

    前面介绍了,使用扩展函数可以很方便地扩充数组Array的处理功能,例如交换两个数组元素.求数组的最大元素等等.那么除了数组之外,日期和时间的相关操作,也是很常见的,比如获取当前日期,获取当前时间.获取 ...

  8. 【Kotlin】Kotlin 中使用 Lambda 表达式替代对象表达式原理分析 ( 尾随 Lambda - Trailing Lambda 语法 | 接口对象表达式 = 接口#函数类型对象 )

    文章目录 一.尾随 Lambda - Trailing Lambda 语法 二.Kotlin 中使用 Lambda 表达式替代对象表达式原理 1.Lambda 替换对象表达式 2.原理分析 3.示例分 ...

  9. IoC-spring 的灵魂(带你轻松理解IOC思想及bean对象的生成过程)

    在理解任何技术之前,我都会问自己一个问题:它的产生是为了解决什么样的问题,以及如何解决这些问题?希望你能在本篇文章中找到答案-- (由于大家对Ioc应该是经常使用了,所以这里不会告诉你应该怎么样使用, ...

  10. 云学院带你入门云计算:如何理解IaaS、 PaaS、SaaS

    今天给大家简单介绍一下云计算入门知识之IaaS. PaaS.SaaS,包括云的划分与介绍. 说到理解IaaS. PaaS.SaaS,先从它们在云中的定位开始. 从上图可以看出云从不同的角度有不同的划分 ...

最新文章

  1. 懒人必备 |通过爬虫 筛选以及查看CSDN 满足相应积分的资源列表 简单好用
  2. java定时器无法自动注入的问题解析(原来Spring定时器可以这样注入service)
  3. php unset 多可以什么_PHP unset() 详解
  4. 如何寻回xp盘符丢失的数据
  5. 数据写入规则IBufferWriterT
  6. python打开浏览器-python调用浏览器,打开一个网址
  7. Spring Cloud Feign 请求压缩 、Feign的日志级别配置
  8. Java并发编程实战_阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF
  9. Maven项目配置、检出、运行
  10. 未来金融科技宣布已完成mBTC系统和技术升级,消费者可用比特币进行在线支付
  11. SDN第一次上机作业
  12. Spring Boot 开发微信公众号
  13. 手机影音最终,软件退出功能的优化
  14. 什么是top sql
  15. Unity中让游戏对象消失或隐藏的几种方法
  16. 强化学习使用gym时出现错误:ValueError: too many values to unpack (expected 4)
  17. MySQL性能优化Buffer Pool详细介绍
  18. MIPS 的评估计算
  19. SQL语句大全—DBA数据(六)
  20. 淘宝API接入说明(按关键词搜索数据示例)

热门文章

  1. 一个留美女博士的七年----分享给所有还相信梦想的朋友(zz 喜欢~~)
  2. GPRS-PDP上下文激活过程
  3. 记录下一个带内购的iOS app的上架App Store历程
  4. 学习Fiddler安全测试
  5. 第4关国际标准书号校验python 头歌
  6. 美团网2015秋季校园招聘面试题(上)
  7. 导出计算机配置信息吗,4种方式:查看电脑配置信息,没有必要用第三方软件。...
  8. Ubuntu社区及其论坛
  9. mysql数据库之基本函数,列属性,数据库管理
  10. 我最喜欢的一节计算机课400字,我最喜欢的一堂课作文400字(精选10篇)