首页 > 其他分享 >kotlin中类初始化顺序介绍

kotlin中类初始化顺序介绍

时间:2023-02-04 13:39:20浏览次数:40  
标签:初始化 反编译 kotlin 代码 init Kotlin 中类 构造函数

问题背景

kotlin的类初始化过程,经常涉及到主构造函数、次构造函数、init函数,那么类初始化过程,他们的执行顺序是什么呢?

问题分析

首先,我们看下主构造函数、次构造函数、init函数分别指啥?

(1)主构造函数

主构造函数是类标头的一部分。比如以下实例:

class Person(val name: String, var age: Int) {

}

用括号括起来的代码块是主要的构造函数:(val name: String, var age: Int)。 构造函数声明了两个属性:name(只读属性,因为它是使用关键字val声明的)和age(读写属性,因为它是用关键字var声明的)。 查看主构造函数对应的java反编译代码如下(具体反编译方法可参考 https://blog.51cto.com/baorant24/6034450 (2)中介绍)): image.png

(2)次构造函数

在Kotlin中,一个类还可以包含一个或多个次构造函数。它们是使用 constructor 关键字创建的。可以在Kotlin中创建次构造函数的方法如下:

class Log {
    constructor(data: String) {
        // 一些代码
    }
    constructor(data: String, numberOfData: Int) {
        // 一些代码
    }
}

查看对应的java反编译代码: image.png

(3)init函数

在 Kotlin 类中 , 可以定义 init 初始化块 , 在其中可以为 变量赋值 , 执行一些检查相关的代码 , 该 init 初始化块在 创建类实例对象 时执行,代码示例如下: image.png

(4)类初始化顺序

Kotlin 类 对象在实例化 时会执行一系列的 初始化操作 , 反编译java代码看看,这些操作执行的顺序 : image.png 可以看出这些操作按照如下顺序执行 : 主构造函数 中属性赋值 类中的属性赋值 init 初始化块 中的代码执行 次构造函数 中的代码执行

问题总结

针对kotlin类结构中的主构造函数、次构造函数、init函数等,本文给与了初步介绍,同时通过反编译java代码的方式,清晰说明了类初始化过程的执行顺序,有兴趣的同学可以进一步深入研究。

标签:初始化,反编译,kotlin,代码,init,Kotlin,中类,构造函数
From: https://blog.51cto.com/baorant24/6037124

相关文章

  • c++中类模板遇到的 不知道怎么解决
    提问:   指定name类型为string填写string的字符串报错啥原因不清楚但报错现实填入的是一个char数组也不知道啥原因解答: 参考代码:template<typenameNameT......
  • Linux服务器初始化基础优化
    注意:这里以Centos为主如何最小化安装系统仅安装需要的,按需安装、不用不装,必须安装的有开发包、基本网络包、基本应用包。ssh登录系统策略vim/etc/ssh/sshd_config#......
  • kotlin的拓展函数和原理
    kotlin的拓展函数和原理问题背景kotlin的使用过程中有个拓展函数的概念,这个概念在java中是没有的,那么问题来了,kotlin中拓展函数是什么呢?拓展函数的概念:不改变原有类的情......
  • 单元测试|Unittest setup前置初始化和teardown后置操作
    Unittestsetup前置初始化和teardown后置操作针对类中每个函数执行时进行前置后置的操作setUp(self):测试前的初始化操作tearDown(self):测试后的操作代码示例:importunittest......
  • kotlin高阶函数(1)——将函数作为参数传递
    kotlin高阶函数(1)——将函数作为参数传递问题背景kotlin语言中,有个高阶函数的概念,那么什么是高阶函数呢?高阶函数的定义:一个函数如果参数类型是函数或者返回值类型是函数,那......
  • flinksql的初始化
    Mavn的依赖<properties><java.version>1.8</java.version><maven.compiler.source>${java.version}</maven.compiler.source><maven.compiler.targ......
  • [原创]Kotlin不要乱用runCatching,小心异常无反应
    这个比较坑的事情我测试程序里本来是使用kotlin里的runCatching方法,来避免异常的。我调用系统邮件应用来发送邮件,添加附件后总是没反应,日志也没有。我也很无语。。。。......
  • 神经网络基础部件-参数初始化详解
    本文内容参考资料为《深度学习》和《解析卷积神经网络》两本书,以及部分网络资料,加以个人理解和内容提炼总结得到。文中直方图的图片来源于参考资料3。一,参数初始化概述......
  • 解决STM32定时器初始化后直接进入中断问题
    解决STM32定时器初始化后直接进入中断问题STM32初始化完毕后第一次启动定时器直接进入中断,原因是定时器的寄存器中断标识没有被清理掉。以HAL库为例,在​​MX_TIMx_Init​​......
  • 初始化顺序、==、AB交换
    初始化顺序题publicclassDemo01{publicstaticvoidmain(String[]args){Cardcard=newCard();card.f();}}classTag{Tag(intmarker){System.......