当前位置: 首页 > news >正文

Kotlin(十一)Kotlin中的Object关键字

  在kotlin中的超类是Any,并没有使用Java中的Object关键字表示超类。

   在Kotlin中Object关键字,另有作用。

1.定义单例类。在一个进程中只有一个类实例。

   这个类,可以用来声明和应用声明周期相关的属性或方法。

object AppConfig {
    //初始化代码块,对象初始化时调用。
    init {
        println("app config init ...")
    }
}
fun main() {
    val app1 = AppConfig
    val app2 = AppConfig
    println(app1)
    println(app2)
}

运行结果:

   可以看到虽然创建了两个对象,AppConfig 初始化代码块,只运行了一次。

   打印两个对象,可以看出,是一样的。也就是说app1和app2是同一个实例。

app config init ...
com.example.kotlin.AppConfig@5594a1b5
com.example.kotlin.AppConfig@5594a1b5

下面是通过show bytecode 反编译后的代码,也就是Kotlin编译后的代码。

init{}对应java中的static{},并且创建了一个静态对象INSTANCE来保存类实例。

public final class AppConfig {
   @NotNull
   public static final AppConfig INSTANCE;

   private AppConfig() {
   }

   static {
      AppConfig var0 = new AppConfig();
      INSTANCE = var0;
      String var1 = "app config init ...";
      System.out.println(var1);
   }
}

 public static final void main() {
      AppConfig app1 = AppConfig.INSTANCE;
      AppConfig app2 = AppConfig.INSTANCE;
      System.out.println(app1);
      System.out.println(app2);
   }

2.对象表达式

    有时候我们需要调用某个类中的方法,但是有不想创建这个类的子类,因为只调用一次就行。

对于这样只用一次就丢弃的实例。我们可以使用objec:类名,创建匿名的类对象,这种方式就是对象表达式。和Java中的匿名内部类类似,都没有名字。

fun main() {
    val p = object :Person("LiLei"){
        override fun doWork() {
            println("$name,is writing code...")
        }
    }
    p.doWork()
}

3.伴生对象。

当我们需要将一个对象的初始化和一个类实例捆绑在一起时。相伴而生,可以考虑使用伴生对象。

通过 companion object{} ,可以在一个类中,创建一个伴生对象。但是,一个类中只允许存在一个伴生对象。

//父类必须用open修饰,才能够被继承
open class Person(val name: String) {
    //伴生对象,
    companion object {
        var idCard = ""
        //当创建类实例时,会自动调用伴生对象的init代码块
        init {
            idCard = "XXX"
            println("companion init")
        }
        fun getId(): String {
            return idCard
        }
    }
}
fun main() {
    //创建类实例是,会调用伴生对象的init代码块
    val p = Person
    //可以通过类实例,访问伴生对象定义的属性和方法
    println(p.idCard)
    println( p.getId())
}

相关文章:

  • java服务器端开发-servlet:2_0、Servlet执行过程介绍:get请求与post请求、编码相关等
  • 自己整理的“无培训广告”的技术公众号!
  • springboot logback-spring.xml 整合apollo实现动态配置日志级别
  • 完全背包问题
  • 【python中级】func_timeout程序超时处理
  • JUC 并发编程_锁
  • java基于springboot+vue的高校大学生社团活动管理系统
  • 框架之SpringBoot基础(二)
  • 【小程序】中WXS的语法详解
  • Spring Cloud Gateway - GatewayFilter路由过滤器
  • 猿创征文|大数据之Kafka简介+基操
  • Shiro授权--注解式开发
  • CREO:CREO软件之零件【编辑】之修饰、用户定义特征的简介及其使用方法(图文教程)之详细攻略
  • Java并发 | 12.[方法] interrupt( )打断
  • SpringBoot 事务开发代码及注意事项
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Android组件 - 收藏集 - 掘金
  • Apache Spark Streaming 使用实例
  • canvas 绘制双线技巧
  • Debian下无root权限使用Python访问Oracle
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SpriteKit 技巧之添加背景图片
  • supervisor 永不挂掉的进程 安装以及使用
  • 计算机常识 - 收藏集 - 掘金
  • 前端面试题总结
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (ros//EnvironmentVariables)ros环境变量
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • .form文件_SSM框架文件上传篇
  • .gitignore文件—git忽略文件
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 5种线程安全集合
  • .NET Core WebAPI中封装Swagger配置
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .Net各种迷惑命名解释
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .ui文件相关
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [CTO札记]盛大文学公司名称对联
  • [elastic 8.x]java客户端连接elasticsearch与操作索引与文档
  • [flask]http请求//获取请求头信息+客户端信息
  • [github全教程]github版本控制最全教学------- 大厂找工作面试必备!
  • [hdu4622 Reincarnation]后缀数组
  • [JavaWeb]—Spring入门
  • [LeetCode]—Copy List with Random Pointer 深度复制带“任意指针”的链表
  • [Linux] MySQL数据库之索引
  • [Lucas定理]【学习笔记】
  • [NOI2012]迷失游乐园
  • [NOIP2014普及组]子矩阵