Kotlin实例初始化时,构造函数、成员变量、init块等的初始化顺序必须弄清楚,否则容易出bug:

Example:


open class Parent {private val a = println("Parent.a")constructor(arg: Unit=println("Parent primary constructor default argument")) {println("Parent primary constructor")}init {println("Parent.init")}private val b = println("Parent.b")
}class Child : Parent {val a = println("Child.a")init {println("Child.init 1")}constructor(arg: Unit=println("Child primary constructor default argument")) : super() {println("Child primary constructor")}val b = println("Child.b")constructor(arg: Int, arg2:Unit= println("Child secondary constructor default argument")): this() {println("Child secondary constructor")}init {println("Child.init 2")}
}

Output:


Child primary constructor default argument
Parent primary constructor default argument
Parent.a
Parent.init
Parent.b
Parent primary constructor
Child.a
Child.init 1
Child.b
Child.init 2
Child primary constructor

Conclusion:


  1. 按照父类->子类的顺序执行初始化(同Java)
  2. 构造函数在成员变量初始化之后执行(同Java)
  3. init与成员变量初始化按照代码位置顺序执行 (重点!)

因此,下面的代码会出现NPE

 class Foo {init {initList()}val list : MutableList<String> = mutableListOf()fun initList() {list.clear()}}

Kotlin类成员初始化顺序相关推荐

  1. java类成员初始化_简单了解Java类成员初始化顺序

    这篇文章主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类中包含7中成员: 1.静态变量 static 2 ...

  2. Java和Kotlin类的初始化顺序

    Java Java程序初始化的顺序:父类静态变量 -> 父类静态代码块 -> 子类静态变量 -> 子类静态代码块 -> 父类非静态变量 -> 父类非静态代码块 -> ...

  3. 类成员初始化顺序php,PHP-php类成员变量初始化的问题?

    PHP类中,若要初始化成员属性,那么成员属性的初始值必须是一个常数,如果不是常数(如变量),则会报错,所以,如果你要初始化就只能是在构造函数里进行初始化,不过你可以写一个方法,这样就可以在构造函数里批 ...

  4. C#中成员初始化顺序

    C#中成员初始化顺序 http://blog.csdn.net/huangcailian/article/details/25958967 一.成员初始化整体顺序 1.成员赋值初始化先于构造函数: 2 ...

  5. Java类的初始化顺序

    对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器. 初始化顺序图示: 我们也可以通过下面的测试代码来验证这一 ...

  6. Java 类的初始化顺序

    Java 类的初始化顺序 Java中类的初始化顺序是:父类静态代码块-->子类静态代码块-->父类非静态代码块-->父类构造器-->子类非静态代码块-->子类构造器. 测 ...

  7. java 初始化参数_JAVA类的初始化顺序与initialize参数

    JAVA类的初始化顺序依次是:(静态变量.静态初始化块)->(变量.初始化块)->构造函数, 相同级别的以定义顺序为准,  且静态变量和静态初始化块只初始化一次.通过下面的代码来验证. p ...

  8. 【转载】c#类的成员初始化顺序

    作者:彭白洋 创建于:2009-01-15 出处:http://www.cnblogs.com/siceblue/archive/2009/01/15/1376430.html  收录于:2013-0 ...

  9. java基础之——类的初始化顺序(转载)

    原文地址:http://www.cnblogs.com/chrischennx/p/3612295.html 由浅入深,首先,我们来看一下,一个类初始化有关的都有些啥米: 静态成员变量.静态代码块.普 ...

最新文章

  1. Tooltip jqueryui
  2. css表格文字超数量就竖排_求助!!一个非常棘手的问题。就是文字竖排显示的问题...
  3. 自动化设备的软件框架
  4. ArcGIS生成根据点图层生成等值面并减小栅格锯齿的操作步骤
  5. HEVC/H265 HM10.0 分析(二)TComDataCU.cpp
  6. icinga-report+jasperserver+icinga-web安装步骤
  7. js数据类型 方法 函数
  8. 字典:python的基础数据类型
  9. apache配置Options详解
  10. ipad协议828版
  11. Java GC机制
  12. 小白上路之javascript数组的介绍
  13. 教你学Java | 带你学习Java多线程(续:创建线程的其他方式与activeCount方法的浅谈)
  14. python基础一 day56
  15. Ubuntu/linux c开发(4)线程池
  16. 赋能数智化· 从数据到价值转变 | GCT冠骋信息高科技电子行业智能制造高端研讨会成功举办
  17. 肺实质分割python实现
  18. VIP + Nginx + Keepalived
  19. html5中创建多个nav,HTML5 对各个标签的定义与规定:nav
  20. [分享]电脑故障应急处理宝典

热门文章

  1. 解决命令行下java编译javac不成功java和java -version可以成功的三种解决方案
  2. kcf算法流程_基于运动检测与KCF算法的目标跟踪方法
  3. wifi ap channel
  4. @教你如何快速启动一个程序!
  5. 软件推荐:思维导图(FreeMind)
  6. 数据库MySQL的基本操作
  7. 机器学习sklearn(10)集成分类
  8. PC通过4G模块上网实现流程记录
  9. 安徽省省长王清宪与曙历军举行工作会谈
  10. 输入自动提示——《超级处理器》应用