Kotlin入门-带着问题,理解 对象表达式和对象声明
前言
本文我们需要了解几个点。
①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入门-带着问题,理解 对象表达式和对象声明相关推荐
- Kotlin学习笔记 第二章 类与对象 第十二 十三节 对象表达式与对象声明 类型别名
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
- android对象申明,Kotlin中的对象表达式和对象声明的具体使用
Kotlin的对象表达式与Java中的匿名内部类的主要区别:匿名内部类只能指定一个父类型,但对象表达式可以指定0~N个肤类型. 一.对象表达式 对象表达式的语法格式如下: object [: 0~N个 ...
- Kotlin学习笔记(六) 伴生对象 对象表达式
2019独角兽企业重金招聘Python工程师标准>>> 一,伴生对象 1.类似于java中的静态方法static class TestCompanion{//伴生对象使用compan ...
- 阿里架构师开源《Kotlin入门教程指南》+《高级Kotlin强化实战》
对于有Java基础的程序员来说,Kotlin是一门非常容易上手的编程语言,也是一门必须掌握的编程语言.Java代码在运行前需要编译生成一种特殊的class文件,然后Java虚拟机会识别并解释这些cla ...
- 零基础入门│带你理解Kubernetes
条分缕析带你充分理解Kubernetes的各个细节与部分:它是什么,它如何解决 容器编排问题,它包含哪些你必须掌握的关键对象,以及如何快速上手部署使用Kubernetes. 容器的好处不胜枚举:一致的 ...
- python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器及生成表达式...
复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
- Kotlin入门(18)利用单例对象获取时间
前面介绍了,使用扩展函数可以很方便地扩充数组Array的处理功能,例如交换两个数组元素.求数组的最大元素等等.那么除了数组之外,日期和时间的相关操作,也是很常见的,比如获取当前日期,获取当前时间.获取 ...
- 【Kotlin】Kotlin 中使用 Lambda 表达式替代对象表达式原理分析 ( 尾随 Lambda - Trailing Lambda 语法 | 接口对象表达式 = 接口#函数类型对象 )
文章目录 一.尾随 Lambda - Trailing Lambda 语法 二.Kotlin 中使用 Lambda 表达式替代对象表达式原理 1.Lambda 替换对象表达式 2.原理分析 3.示例分 ...
- IoC-spring 的灵魂(带你轻松理解IOC思想及bean对象的生成过程)
在理解任何技术之前,我都会问自己一个问题:它的产生是为了解决什么样的问题,以及如何解决这些问题?希望你能在本篇文章中找到答案-- (由于大家对Ioc应该是经常使用了,所以这里不会告诉你应该怎么样使用, ...
- 云学院带你入门云计算:如何理解IaaS、 PaaS、SaaS
今天给大家简单介绍一下云计算入门知识之IaaS. PaaS.SaaS,包括云的划分与介绍. 说到理解IaaS. PaaS.SaaS,先从它们在云中的定位开始. 从上图可以看出云从不同的角度有不同的划分 ...
最新文章
- 懒人必备 |通过爬虫 筛选以及查看CSDN 满足相应积分的资源列表 简单好用
- java定时器无法自动注入的问题解析(原来Spring定时器可以这样注入service)
- php unset 多可以什么_PHP unset() 详解
- 如何寻回xp盘符丢失的数据
- 数据写入规则IBufferWriterT
- python打开浏览器-python调用浏览器,打开一个网址
- Spring Cloud Feign 请求压缩 、Feign的日志级别配置
- Java并发编程实战_阿里P9整理分享的亿级流量Java高并发与网络编程实战PDF
- Maven项目配置、检出、运行
- 未来金融科技宣布已完成mBTC系统和技术升级,消费者可用比特币进行在线支付
- SDN第一次上机作业
- Spring Boot 开发微信公众号
- 手机影音最终,软件退出功能的优化
- 什么是top sql
- Unity中让游戏对象消失或隐藏的几种方法
- 强化学习使用gym时出现错误:ValueError: too many values to unpack (expected 4)
- MySQL性能优化Buffer Pool详细介绍
- MIPS 的评估计算
- SQL语句大全—DBA数据(六)
- 淘宝API接入说明(按关键词搜索数据示例)