Kotlin语言中文站

对象声明

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

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

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

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

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

fun main(args: Array<String>) {UserInfoManager.userTypeUserInfoManager.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 = falsefun open(context:Context){val it = Intent(context, SecondActivity::class.java)context.startActivity(it)}}
}

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

SecondActivity.openTagSecondActivity.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 methodpublic Named(DefaultConstructorMarker $constructor_marker) {this();}}
}

这里归纳一下:

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

不过在实际使用中,可省略名称Companion或者NamedMachine.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 = 0val y : Int = 0
}
//可直接使用tempObject内部成员
println("tempObject : $tempObject.x - $tempObject.y")

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

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

Kotlin学习历程——对象声明与伴生对象相关推荐

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

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

  2. Kotlin学习之路(4)——类,对象和接口

    类,对象和接口 之前的篇章已经简单的介绍过如何声明一个类,也知道了一些简单的主构造方法来声明方法和属性,以及使用枚举类. 类和接口 接口 和Java相同的是,我们同样用interface来定义一个接口 ...

  3. Kotlin学习笔记 第二章 类与对象 第一节类与继承(补)

    参考链接 Kotlin官方文档 Kotlin docs | Kotlin 本系列为参考Kotlin中文文档 kotlin官方文档2020版.pdf-其它文档类资源-CSDN下载 第二章 第一节 类与继 ...

  4. Kotlin学习笔记 第二章 类与对象 第二节属性

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

  5. Kotlin学习笔记 第二章 类与对象 第五节 可见性 第六节 扩展

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

  6. Kotlin学习笔记 第二章 类与对象 第七节 数据类

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

  7. Kotlin学习 PART 3:类,对象和接口

    = =,感觉自己写的东西没什么人看呢= =,算了,本来就是自己写给自己看的东西,尽力了就行,也不指望像鸿神一样出名= = 1. class User constructor(_nickname:Str ...

  8. Kotlin学习笔记 第二章 类与对象 第十四 十五节 委托 委托属性

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

  9. Kotlin学习笔记 第二章 类与对象 第九节 泛型

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

最新文章

  1. Spring事务的实现方式和实现原理
  2. 粉丝提问:有没有人会做彩虹表
  3. 怎么查看oracle中sys的密码修改,oracle sys 密码修改
  4. SAP License:SAP实施Roll out项目经验谈(二)
  5. 35张史上最全IT架构师技术知识图谱
  6. Dev Grid 添加行号
  7. 网狐荣耀手机端内核源码
  8. 计算机无法删除tf卡的内容,SD卡无法格式化数据可以读取,但是删除不掉
  9. Elsevier LaTeX 模板中参考文献没有序号,且文章引用不是序号引用
  10. subprocess.CalledProcessError: Command ‘git tag‘ returned non-zero exit status 1.(yolov5报错)
  11. Linux 系统使用 git 提交代码-- git 的安装及使用(简明教学指南)
  12. 【office2010】利用尾注添加参考文献
  13. linux用shell脚本写游戏,shell脚本实现猜数游戏
  14. oracle自带的缓存,ORACLE缓存表与ORACLE缓存
  15. 抽象类:小样儿(接口),我一眼看出你就不是人(抽象类)
  16. 关于标准电阻阻值的说明(E6、E12、E24、E48、E96、E192)
  17. linux命令行看图工具,六个鲜为人知的超酷Unix/Linux命令
  18. 反射光栅 PRK46C.D4P-M12
  19. 新中关大厦污水泵站远程监控系统解决方案
  20. 没有公网IP怎样访问异地视频监控

热门文章

  1. 狗狗的年龄的python编程_狗狗年龄和人怎么换算
  2. 行式存储和列式存储优缺点和paruqet文件结构
  3. Bootstrap从入门到实战---模态框
  4. Excel报表生成器,一键轻松生成各种报表
  5. [WinError 10061]
  6. 微信又悄悄更新!网友:终于等到了
  7. Win10系统FF新推荐怎么卸载?FF新推荐新闻弹窗彻底关闭删除教程
  8. 亚马逊云科技智能湖仓架构实践:利用Amazon Redshift的流式摄取构建实时数仓
  9. 解决 ‘Invalid use of NULL value‘ 问题
  10. Windos安装Git和配置及GitLib详细使用