Kotlin学习历程——对象声明与伴生对象

Kotlin 对象与 object 关键字 本文讲到的对象,并非面向对象中的“对象”,而是指 Kotlin 中用 object 关键字声明的结构,它的功能相当强大,既可用来声明单例类,也可包装数据,还能充当匿名内部类。 立即下载

Kotlin语言中文站

对象声明

如下代码写法称为对象声明:

object UserInfoManager {
    //用户类型
    val userType : Int = 0
    
    //获取用户登录信息
    fun getLoginInfo() : String {
        return "用户登录信息"
    }
}

直观一点,我们转成java代码看看:

public final class UserInfoManager {
   private static final int userType;
   @NotNull
   public static final UserInfoManager INSTANCE;
    
   private UserInfoManager() {}

   static {
      UserInfoManager var0 = new UserInfoManager();
      INSTANCE = var0;
   } 
    
   @NotNull
   public final String getLoginInfo() {
      return "用户登录信息";
   }
}

单例模式(饿汉式)!这就简单明了了,类里面的属性和方法便可直接调用:

fun main(args: Array<String>) {
    UserInfoManager.userType
    UserInfoManager.getLoginInfo()
}

对象声明的语义我们可以理解为:定义一个类并且创建该类的单例。 我们需要注意的是:对象声明不能定义在函数内部,或者内部类中。


伴生对象

类内部的对象声明可以用companion关键字来标记,这种方法声明的对象叫类的伴生对象。

open class Machine {
    /** Machine类的伴生对象 */
    companion object {
        fun create() {}
    }
}

我们把kotlin代码转成Java代码看看:

public class Machine {
   public static final Machine.Companion Companion = new Machine.Companion((DefaultConstructorMarker)null);

   public static final class Companion {
      public final void create() {
      }

      private Companion() {
      }

      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}

跟对象声明本质上差不多,都是定义一个类并且创建该类的单例。 伴生对象常见使用场景就是定义类变量或者类方法,因为在Kotlin中没有static关键字也就没法定义静态成员,而伴生对象就可以为我们解决这个问题:

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
    
    companion object {
        val openTag : Boolean = false

        fun open(context:Context){
            val it = Intent(context, SecondActivity::class.java)
            context.startActivity(it)
        }
    }
}

在其他activity中就可以直接调用:

SecondActivity.openTag
        
SecondActivity.open(this)

我们可以给伴生对象自定义名称,如果没有自定义名称默认将使用名称Companion, 如下是自定义名称Named:

open class Machine {
    companion object Named{
        fun create() {}
    }
}

Java代码:

public class Machine {
   public static final Machine.Named Named = new Machine.Named((DefaultConstructorMarker)null);

   public static final class Named {
      public final void create() {
      }

      private Named() {
      }

      // $FF: synthetic method
      public Named(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}

这里归纳一下:

  • 如果没有声明伴生对象的名称,默认使用名称Companion,调用伴生对象成员:Machine.Companion.create();
  • 如果声明了伴生对象名称,比如名称为Named,那么调用伴生对象成员:Machine.Named.create();

不过在实际使用中,可省略名称Companion或者Named:Machine.create();


对象表达式

创建一个匿名类的对象,就可以用对象表达式来实现。如下代码:

fun main(args: Array<String>) {
    //对象表达式
    val mListener = object : TestListener {
        override fun callback() {}
    }
    UserInfoManager.listener = mListener
}


//如果有多个超类,用逗号分隔便可:
fun main(args: Array<String>) {
    //多个超类
    val mListener = object : TestListener, IListener {
        override fun callback() {}
    }
    //赋值
    UserInfoManager.listener = mListener
}

在android中最具代表性的代码就是按钮的点击事件监听了:

Button(context).setOnClickListener(object : View.OnClickListener{
    override fun onClick(v: View?) {
        //todo:click
    }
})

此外,有时候我们只是需要“一个对象而已”,并不需要特殊超类,我们可以简单地写:

val tempObject = object {
    val x : Int = 0
    val y : Int = 0
}
//可直接使用tempObject内部成员
println("tempObject : $tempObject.x - $tempObject.y")

不过这种写法也只能在声明处作用域使用,外面根本没法传递(传递的话是传递Any,定义的信息丢失了,失去了原本意义),实际用处不大。


上一篇:Kotlin学习历程——嵌套类与内部类
下一篇:Kotlin学习历程——函数与Lambda表达式(一)

kotlin中object关键字的三种使用场景 前言 object是Kotlin中的一个重要的关键字,也是Java中没有的。object主要有以下三种使用场景: 对象声明(Object Declaration) 伴生对象(Companion Object) 对象表达式(Object Expression) 下面就一一介绍它们所表示的含义、用法以及注意点,保证你在看完本篇之后就可以完全掌握object关键字的用法。 1. 对象声明(Object Declaration) 语法含义:将类的声明和定义该类的单例对象结合在一起(即通过object就实现了单例模式) 基本示例 object RepositoryManager{ fun 立即下载

相关推荐

Winget安装失败:深入解析InternetOpenUrl()错误0x80072efd的根源与修复

本文深入解析了使用Winget时遇到的InternetOpenUrl()错误0x80072efd。该错误通常源于DNS解析失败、网络代理配置不当或系统安全策略冲突,导致无法连接软件源。文章提供了从刷新DNS、修改Hosts文件到配置代理等一套完整的诊断与修复方案,帮助开发者快速解决安装障碍,恢复Winget的正常使用。

weixin_29290259的博客 932

Kotlin系列之伴生对象

上一节中说到了对象声明,这次我们聊聊对象声明的一种特殊情况,对象声明在一个类内部,也就是标题所说的伴生对象。 伴生对象最简单直白的理解就是与一个类相伴而生的对象,由于它处于类内部,所以必然和包含它的类存在某种联系。 基本用法 伴生对象使用关键字companion来声明,看起来就像是在object关键字前面加的一个修饰符。它的一般格式如下: class 外部类名{ com...

写代码的林克 3167

磁传感器技术解析:从霍尔效应到车规级应用,纳芯微的本土第一之路

磁传感器是现代工业与汽车电子中的关键感知元件,其技术演进经历了从分立器件到高集成度SoC的跨越。霍尔效应与磁阻效应构成两大物理基础,其中硅基霍尔方案凭借高性价比与成熟供应链,在车规级应用中占据主流。高精度电流检测、角度与位置感知、磁开关等场景,对传感器的温漂抑制、共模瞬态抗扰与批量一致性提出严苛要求。车规级可靠性体系与系统级集成能力,成为衡量供应商的核心标尺。随着新能源主驱、光伏逆变、工业伺服等应用爆发,具备完整信号链与隔离技术积累的厂商正逐步构建护城河。本文以纳芯微为样本,剖析其从隔离技术延伸至磁传感器平

weixin_34387468的博客 365

Kotlin系列之对象声明

隔了比较久的一段时间了,继续来学习一点Kotlin,今天说说Kotlin中的对象声明。 我们都知道在Java中,必须先有类,然后才能new出对象,也就是声明类和创建对象是两个分开的步骤,并有先后次序。在Kotlin中,我们可以使用object关键字在声明定义一个类的同时创建出一个对象,也就是我们标题所说的对象声明,下面就来一起看看对象声明的相关知识点。 基本用法 对象声明的基本格...

写代码的林克 1627

数学建模学习(5):最全概率分析之图表绘制详解,内容比较多,建议收藏

(1) 绘制正整数频率使用 tabulate(X) (2)

全栈川川 4593

AI Agent驱动的多模态情感分析方法:从BERT到Vision Transformer的探索

情感分析(Sentiment Analysis)是自然语言处理(NLP)与计算机视觉(CV)中一项重要任务。传统的情感分析主要依赖于文本数据,但在现实应用中,情感往往通过 语言、语音、表情、姿态 等多模态信号共同传达。因此,结合 多模态深度学习 的 AI Agent 在情感理解中具有广阔的前景。

一键难忘的博客 738

Kotlin object关键字总结

Kotlin object 关键字用于实现单例(懒加载、线程安全)、伴生对象(类级别成员,类似 static)及匿名对象(临时实例)。单例通过 object 声明;伴生对象用 companion object 定义,可被外部直接调用或通过 @JvmStatic 优化 Java 调用;匿名对象则用于无需命名的临时对象,常用于回调或监听器。

xiangxiongfly 3119

订餐平台餐厅信息抓取:使用Python爬虫获取商家信息和用户评价

在这篇博客中,我们展示了如何使用Python爬虫抓取订餐平台上的餐厅信息和用户评价数据。通过使用requests和Selenium,我们能够有效地从静态和动态网页中提取数据,并使用pandas和matplotlib对数据进行存储和分析。未来,您可以根据需求进一步扩展功能,例如增加错误处理、增加抓取多个页面的能力,或者使用高级技术如分布式爬虫来抓取更大规模的数据。

2201_76125261的博客 1651

2021-10-11 kotlin 对象声明、伴生对象、对象表达式

对象的声明: ① 创建类的同时创建一个对象 ② 对象的属性和方法类似于类的静态方法和属性,可以通过对象.方法、对象.属性在外面调用。 ③ 对象直接利用对象声明的该特性,将类的声明和实例的声明结合在一起,因为不能有其他方式创建对象,所以满足单例模式。 ④ 对象的声明创建的实例只有一个。 当然你也可以定义一个变量来获取获取这个对象,当时当你定义两个不同的变量来获取这个对象时, 你会发现你并不能得到两个不同的变量。也就是说通过这种方式,我们获得一个单例。 object Site { var url:Str

qq_45204129的博客 416

全15万字丨PyTorch 深度学习实践、基础知识体系全集;忘记时,请时常回顾。

本篇博客介绍的知识是——深度学习之PyThon框架基础。这是深度学习/神经网络的基础,多次回顾,会有不一样的感受。书读百遍,其义自见。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 5788

36、T5L 迪文屏C51开发之绘制动态曲线

T5L 迪文屏C51开发之绘制动态曲线1、介绍2、例程功能简介3、GUI界面设计3、C51程序设计 1、介绍   本文将利用DGUS Tool软件中的【动态曲线控件】来绘制曲线效果,在T5L迪文屏中总共支持8个通道的曲线,而曲线数据是需要缓冲区的,如果 8 通道曲线同时使用,0x1000-0x4FFF 将作为曲线缓冲区地址,此时该部分变量地址不能被其他控键使用,其他控键地址使用范围为0x5000-0xFFFF,当某曲线通道不被使用时,那么其所对应的缓冲区地址可以做其他用途,曲线通道具体的地址分布如下图所示:

嵌入式羊圈 3132

Kotlin-对象声明(object)

对象声明的作用 在Java中经常会使用到单例模式,定义一个使用private构造方法并且使用静态字段来持有这个类仅有的实例。例如: public class Singleton { public static Singleton instance = new Singleton(); private Singleton() { } } 在Kotlin中,可以使用对...

zxf15735185131的博客 941

详解Linux下使用vscode编译运行和调试C/C++

本教程将具体详解使用Visual Studio Code在Linux环境下使用C/C++方法。 GCC C++ 编译器 (g++) 和 GDB 调试器的方法。 GCC是GNU 编译器集合; GDB 是 GNU 调试器。 1.先决条件 安装Visual Studio Code. 安装C++拓展插件。点击在vscode界面最左侧的Extensions图标(打开快捷键:ctrl+shift+X),搜索“C/C++”,点击进行安装。 确保已安装gcc. 一般ubuntu系统会预装gcc.在终端窗口中输入如下命令

休的博客 6241

Kotlin学习历程——扩展

Kotlin语言中文站 kotlin能够扩展一个类的新功能而无需继承该类,这种方式叫做扩展。例如:你可以为一个你不能修改的,来自第三方库中的类编写一个新的函数,这个新增的函数就像那个原始类本来就有的函数一样。 定义扩展函数 声明一个扩展函数,我们需要用一个接收者类型也就是被扩展的类型来作为他的前缀。 /** 在Extension.kt文件中定义扩展函数 */ fun <T> MutableList<T>.swap(index1: Int, index2: Int) { .

hepingdev的专栏 2278

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Kotlin学习基础知识大全(上)

Kotlin是由JetBrains公司开发的一种静态类型编程语言,最初发布于2011年。JetBrains是知名IDE工具IntelliJ IDEA的开发商,他们开发Kotlin的目的是为了解决Java语言在开发效率、代码简洁性和安全性方面的一些不足。2016年2月,Kotlin 1.0正式发布,标志着语言进入稳定阶段。2017年5月,在Google I/O大会上,Google宣布Kotlin成为Android开发的官方支持语言,这一决定极大地推动了Kotlin的普及。Kotlin中使用fun。

百锦再的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Kotlin手记(一):基础大杂烩

2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言2012年2月,JetBrains以Apache 2许可证开源此项目。2016年2月15日,Kotlin v1.0发布,这被认为是第一个官方稳定版本。在Google I/O 2017中,Google宣布在Android上为Kotlin提供最佳支持,取代java成为官方开发语言。

苦逼的程序猿☺ 1800

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Kotlin学习历程——嵌套类与内部类

Kotlin语言中文站 嵌套类 与Java类似,在Kotlin中类与类可以互相嵌套,类与接口也可以互相嵌套。 class LoginContract { private val TAG = javaClass.simpleName class Presenter : BasePresenter<View>() { fun login(username: String, pwd: String) { //取不到TAG常量 .

hepingdev的专栏 1197

使用 Kotlin 开发几个月后,我后悔了!团队决定回归 Java

作者:Bartosz Walacik链接:https://allegro.tech/2018/05/From-Java-to-Kotlin-and-Back-Again.html译者:安...

Java和Android架构 439

Kotlin学习历程三:kotlin中的变量、常量和注释

一、变量 kotlin中变量的声明和java有很大区别,必须使用var或var关键字。 var表示:可变变量,可读也可写,相当于java中的普通的变量。 val表示:不可变变量,可读但是不可写,相当于java中用final修饰的变量。 1.1 基础用法: 格式:关键字(var/val) 变量名: 数据类型 = xxx 其中。var和val是Kotlin中定义变量必须使用的关键字。 每...

LeeKumaの技术Note 436

Kotlin 语言 知识点整理1【个人用】

Kotlin作为JetBrains开发的现代化语言,以其简洁、安全和高效特性成为Java的理想替代。它与Java完全互操作,共享JVM平台和生态系统,但通过空安全机制、扩展函数、数据类等特性大幅减少样板代码。核心优势包括:1)强制空安全设计杜绝NPE;2)支持函数式编程和Lambda表达式;3)协程简化异步编程;4)扩展函数增强代码组织。Java开发者应重点掌握空安全处理、集合操作、作用域函数及协程应用,通过IDE转换工具和Kotlin标准库快速上手。渐进式迁移策略和"以Kotlin方式思考&qu

indeedes的博客 261

快速切换至Kotlin for Android模式

前言 几个特性,快速上手Kotlin 充分理解Kotlin,快速上手写业务 快速切换至Kotlin for Android模式 聊一聊Kotlin中的协程,真香 关于Kotlin的文章,已经构思了很久。一直不知道该怎么写。文档式文章?那不如直接看文档,何必需要我再多“哔哔”呢。思来想后,决定写一篇快速在Android开发中感受Kotlin的其妙的文章。 说实话,最开始搞Kotlin我是拒绝的。为啥...

weixin_34138377的博客 159

24:kotlin 类和对象 -- 对象表达式和声明(Object expressions and declarations)

如果需要创建一个稍微修改了某个类的对象,而不需要显式地声明一个新的子类。Kotlin可以通过对象表达式(object expressions)和对象声明(object declarations)来处理这种情况。

qq_40104261的博客 2138

Kotlin对象和伴生对象

1、object kotlin中的对象是指的是使用object关键字定义的类型声明,一般用作单例模式和伴生对象。它让单例变得十分简单 2、伴生对象 kotlin的一个特性:没有静态成员 静态成员在java中有很大的作业,因为java没有全局变量,也不存在包级函数,一切属性和方法都是在类里面,所以在写一些工具函数和全局变量时,都需要用到static关键字修饰的静态成员。 kotlin之所以能抛弃静态成员,主要原因在于它允许包级属性和函数的存在。 经典做饭: kotlin允许在类中使用co

nicolelili1的专栏 1572

【译】kotlin 官方文档翻译-对象表达式和对象声明

这里需要注意匿名对象作为类型只能出现在本地或者私有声明中. 如果把匿名对象作为公有函数返回类型或者公有属性时, 真正的类型将会是匿名函数的超类,如果声明没有超类则会使。:对象声明不可以是局部的(比如不可以直接在函数内部声明),但可以在其它对象的声明或非内部类中进行内嵌入。​ 伴随对象是在对应的类加载时初始化的,和 Java 的静态初始是对应的。对象声明是懒加载的,是在我们第一次访问时初始化的。在对象表达式中可以访问来自包含它的作用域的变量..作为成员变量的匿名对象是不可访问的.

xiaoshun007的专栏 215

Kotlin中的 object 对象

object 对象

伯特立的专栏 2796

Kotlin开发(七):对象表达式、对象声明和委托的奥秘

通过 Kotlin 的对象表达式、对象声明和委托功能,我们实现了一个模块化的任务管理系统。使用这些特性不仅简化了代码逻辑,还提高了可维护性和扩展性。在实际项目开发中,这些技术可以灵活应用到不同场景中。四、技术难点及解决方案问题:对象表达式的作用域限制解决:将对象作为变量存储在函数外部,扩展其生命周期。问题:委托性能问题解决:避免复杂逻辑嵌套,保持委托功能单一化。Kotlin 的对象机制将继续演化,特别是在多平台开发(KMM)中具有巨大潜力。

刘 争 1100
上一篇: Kotlin学习历程——嵌套类与内部类
下一篇: Kotlin学习历程——函数与Lambda表达式(一)
hepingdev
博客等级 码龄5年 3581粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hepingdev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值