Kotlin快速入门系列9
Kotlin对象表达式和对象声明
对象表达式
有时,我们想要创建一个对当前类有些许修改的对象同时又不想重新声明一个子类。如果是Java,可以用匿名内部类的概念来解决这个问题。kotlin的对象表达式和对象声明就是为了实现这一点(创建一个对某个类做了轻微改动的类的对象,且不需要去声明一个新的子类)。
对象表达式的格式:
Object[: 若干个父类型,中间用逗号分隔]
例如下例常见的,通过对象表达式实现的将一个匿名内部类的对象用于方法的参数中:
computer.addMouseListener(object : MouseAdapter() {override fun mouseClicked(e: MouseEvent) {// ...}override fun mouseRolled(e: MouseEvent) {// ...}
})
通过对象表达式可以越过类的定义直接得到一个对象:
fun main(args: Array<String>) {val site = object {var tips: String = "谷歌大法好"var url: String = "www.Google.com"}println(site.tips)println(site.url)
}
对应的控制台输出为:

如果超类有构造器,则需要传入合适的参数。多个超类在冒号之后使用逗号分隔,大抵格式如下:
open class BaseA(x: Int){public open val num: Int = x
}interface InterfaceB {...}val ab: A = object : BaseA(1) , InterfaceB{override val num = 15
}
用作类型的匿名对象,只能在局部和私有声明中。如果使用匿名对象作为public函数的返回值,或public属性的类型,则函数或属性的实际类型实际为匿名类的超类或Any(未声明任何超类)。匿名对象添加的成员不能被访问。下面是一个官网的例子:
class Demo{// 私有函数,所以返回类型为匿名对象类型private fun foo() = object {val x: String = "foo"}// Public函数,返回类型为Anyfun publicFoo() = object {val x: String = "FOO"}fun bar() {val x1: String = foo().x // 有效val x2: String = publicFoo().x // 提示错误:无法引用x}
}
对象声明
在Kotlin中,使用 object 关键字来声明一个(单例)对象。这点跟Java是完全不一样的,在Java中,必须先有类,然后才能new出该类的对象并生成实例,也就是声明类和创建对象是两个分开的步骤,并有先后次序。在Kotlin中,我们可以使用object关键字在声明定义一个类的同时创建出一个对象,这就是所谓的对象声明。
使用方法极其简单,在 object 关键字后跟⼀个名称即可,这样就直接声明了一个单例对象。
object DataProviderManager {fun registerDataProvider(provider: DataProvider) {
// ……}val allDataProviders: Collection<DataProvider>get() = // ……
}
要引⽤该对象,直接使⽤其名称即可:
DataProviderManager.registerDataProvider(……)
注意这里是单例,当你定义两个不同的变量来获取这个对象时,你会发现你并不能得到两个不同的变量,如下例我们只对一个对象实例进行了属性更改,但打印两个对象实例都会得到更改的属性:
object WebSite {var url:String = ""val web: String = "谷歌大法好"
}
fun main(args: Array<String>) {var s1 = WebSitevar s2 = WebSites1.url = "www.Google.com"println(s1.url)println(s2.url)
}
对应的控制台输出为:

与对象表达式不同的是,当对象声明在另一个类的内部时,这个对象并不能通过外部类的实例访问到该对象,而只能通过类名来访问,同样该对象也不能直接访问到外部类的方法和变量。
object WebSite {var web = "谷歌大法好"object DeskTop{var url = "www.Google.com"fun showName(){print{"desk legs $web"} // 错误,不能访问到外部类的方法和变量,打印结果为:Function0<java.lang.String>}}
}
fun main(args: Array<String>) {var site = WebSitesite.DeskTop.url // 提示错误,不能通过外部类的实例访问到该对象WebSite.DeskTop.url // 调用方式正确
}
伴生对象
跟Java不同,在kotlin中,类是没有static方法的。多数情况下,Kotlin推荐的做法是使用包级别的函数作为静态方法。这里就引申除了另外一个关键字,companion。
在类内部的对象声明可以用 companion 关键字标记,这样它就与外部类关联在一起,我们可以直接通过外部类访问到对象的内部元素。
class DemoClass {companion object Factory {fun create(): DemoClass = DemoClass()}
}val instance = DemoClass.create() // 变量可直接访问到对象的内部元素
我们可以直接省略掉该对象的对象名,然后使用 companion 替代需要声明的对象名:
class DemoClass {companion object {}
}val instance = DemoClass.Companion
这里需要注意的是,一个类里面只能声明一个内部关联对象,即关键字 companion 只能使用一次。
伴生对象的成员看起来像其他语言的静态成员,但在运行时他们仍然是真实对象的实例成员。在 JVM 平台,如果使⽤ @JvmStatic 注解,你可以将伴⽣对象的成员⽣成为真正的静态⽅法和字段。
差异性
最后总结下,对象表达式和对象声明之间有一个重要的语义差别:
· 对象表达式是在使用他们的地方立即执行的;
· 对象声明是在第一次被访问到时延迟初始化的;
· 伴生对象的初始化是在相应的类被加载(解析)时,与 Java 静态初始化器的语义相匹配。
相关文章:
Kotlin快速入门系列9
Kotlin对象表达式和对象声明 对象表达式 有时,我们想要创建一个对当前类有些许修改的对象同时又不想重新声明一个子类。如果是Java,可以用匿名内部类的概念来解决这个问题。kotlin的对象表达式和对象声明就是为了实现这一点(创建一个对某个类做了轻微改…...
nginx+nginx-rtmp-module+ffmpeg进行局域网推流rtmp\m3u8
局域网推流的简单方式 这里以ubuntu为例 一、先下载安装包 nginx、nginx-rtmp-module,再一起安装 # 下载nginx # 这里我安装的是 nginx-1.10.3 版本 cd /usr/software wget http://nginx.org/download/nginx-1.25.0.tar.gz tar -zxvf nginx-1.25.0.tar.gz# 下载ng…...
PMP备考笔记:模拟考试知识点总结
1. 答题思路:优先看问题,可节省时间。 2. 考试就按照考试的套路来做,不要过多考虑。 开发团队只专注当前冲刺目标,产品负责人对PB排优先级。 收集需求工具-原型法:能够让用户提前体验,减少返工的风险。 …...
docker程序镜像的安装
目录 一、流程 二、总结 一、 流程 对文中脚本测试前提默认系统已安装docker docker程序部署命令脚本 加载已打包的docker程序 docker load < sto...p.tar创建网络 名称为c…m子网subnet 172.27.16.1/24网关gateway 172.27.16.254-d 指定网络驱动程序 docker network cre…...
openssl3.2 - .pod文件的查看方法
文章目录 .pod文件的查看方法概述笔记初步的解决方法备注 - pod2html.bat的详细用法好像Perl就自带这个BATEND .pod文件的查看方法 概述 看到openssl源码目录下有很多.pod文件, 软件发布的帮助内容都在里面. 当make install后, 大部分的.pod都会转成html文件, 但是有一部分…...
力扣238. 除自身以外数组的乘积(前后缀和)
Problem: 238. 除自身以外数组的乘积 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1: 1.先求取数组的包括当前下标值得前后缀乘积(利用两个数组记录下来分别为leftProduct和rightProduct) 2.当求取一个下标为i的数组中的元素&#x…...
Java玩转《啊哈算法》排序之快速排序
心无挂碍,无挂碍故,无有恐怖,远离颠倒梦想,究竟涅槃。 地图 引子代码地址快速排序核心代码优劣完整代码演示 课后习题 引子 搭嘎好!本人最近看的《啊哈算法》这本书写的确实不错,生动形象,在保…...
静态代理IP该如何助力Facebook多账号注册运营?
在Facebook运营中,充分利用静态代理IP是多账号运营的关键一环。通过合理运用静态代理IP,不仅可以提高账号安全性,还能有效应对Facebook的算法和限制。以下是这些关键点,可以帮助你了解如何运用静态代理IP进行Facebook多账号运营&a…...
npm 淘宝镜像正式到期
由于node安装插件是从国外服务器下载,如果没有“特殊手法”,就可能会遇到下载速度慢、或其它异常问题。 所以如果npm的服务器在中国就好了,于是我们乐于分享的淘宝团队干了这事。你可以用此只读的淘宝服务代替官方版本,且同步频率…...
【Spring Boot 3】【@Scheduled】多线程执行定时任务
【Spring Boot 3】【@Scheduled】多线程执行定时任务 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新…...
TypeScript 基础学习
TypeScript是具有类型语法的JavaScript。 是JavaScript超集,可以编译为纯JavaScript,构建安全可靠的代码,进行类似 babel 的转换。 一种基于JavaScript的强类型、静态的编程语言,提供了类型检测的工具。 特性: 易读…...
《CSS3》田字网格背景(外实线内虚线)的实现
一、前言 记录一些有趣的CSS实现方式,总所周知,当一段效果可以通过CSS实现的时候,绝不使用Javascript来实现,因此记录一些有意思的CSS效果,一来是方便自己学习,另一来是方便以后在需要使用到的时候能快速找…...
图书管理系统(ArrayList和LinkedList)--versions3.0
目录 一、项目要求: 二、项目环境 三、项目使用的知识点 四、项目代码 五、项目运行结果 六、项目难点分析 图书管理系统--versions1.0: 图书管理系统--versions1.0-CSDN博客文章浏览阅读981次,点赞29次,收藏17次。本文使用…...
游戏开发丨基于Pygame的AI版贪吃蛇小游戏
文章目录 写在前面需求分析程序设计程序分析运行结果系列文章写在后面 写在前面 本期内容 基于pygame的AI版贪吃蛇小游戏 所需环境 pythonpycharm或anacondapygame 下载地址 https://download.csdn.net/download/m0_68111267/88789665 需求分析 本游戏使用Pygame模块开…...
qt-C++笔记之QStringList、QList<QString>、QString、QChar、QList<QChar>区别
qt-C笔记之QStringList、QList、QString、QChar、QList区别 —— 杭州 2024-01-30 凌晨0:27 参考博文:qt-C笔记之QStringList code review! 文章目录 qt-C笔记之QStringList、QList<QString>、QString、QChar、QList<QChar>区别1.Qt的字符容器类1.QSt…...
python爬虫学习之解析_BeautifulSoup
目录 一、bs4的基本使用 (1)导入 (2)创建对象 二、节点定位 1、根据标签名查找节点 2、基本函数使用 (1)find (2)find_all (3)select 三、节点信息 1、获取节…...
2024美赛数学建模赛题解读常用模型算法
回归拟合预测 拟合预测是建立一个模型去逼近实际数据序列的过程,适用于发展性的体系。建立模型时,通常都要指定一个有明确意义的时间原点和时间单位。而且,当t趋向于无穷大时,模型应当仍然有意义。将拟合预测单独作为一类体系研究…...
NoSQL 数据库管理系统和模型的比较
前些天发现了一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站。 NoSQL 数据库管理系统和模型的比较 介绍 当大多数人想到数据库时,他们通常会想到传统的关系数据库…...
数据库(SQL)
目录 1 触发器 1.1 触发器简介 1.2 触发器的创建 语法 说明 1.3 示例 2 存储过程 2.1 什么是存储过程(函数) 2.1.1 存储过程和存储函数的区别 2.2 优势 2.3 应用场景 2.4 存储过程的创建和使用 说明 各参数类型所实现的存储过程 无参数无返…...
如何用Docker+jenkins 运行 python 自动化?
1.在 Linux 服务器安装 docker 2.创建 jenkins 容器 3.根据自动化项目依赖包构建 python 镜像(构建自动化 python 环境) 4.运行新的 python 容器,执行 jenkins 从仓库中拉下来的自动化项目 5.执行完成之后删除容器 前言 环境准备 Linux 服务器一台(我的是 CentOS7)…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...
