飞道的博客

kotlin的主构造函数,次构造函数,init代码块,伴生对象的执行顺序,特点,使用场景,及跟java的比较

625人阅读  评论(0)

 

kotlin的主构造函数, 次构造函数, init代码块, 伴生对象的执行顺序, 特点, 使用场景, 及跟java的比较 

 

目录

kotlin的主构造函数, 次构造函数, init代码块, 伴生对象的执行顺序, 特点, 使用场景, 及跟java的比较 

测试代码1:

结果1: 

测试代码2:

结果2: 

结论--执行顺序: 

结论--跟java的比较, 特点, 使用场景: 

Java的初始化块、静态初始化块、构造函数的执行顺序及用途


 

 

测试代码1:


  
  1. class Person( var from: String) {
  2. /*属性from*/
  3. //已经在主构造函数中声明 private var from: String = ""
  4. /*次构造方法*/
  5. constructor(from1: String, name: String) : this(from1) {
  6. println( "constructor, from:$from1\n")
  7. }
  8. companion object {
  9. val instance = Person( "companion")
  10. /*伴生对象中的初始化代码*/
  11. init {
  12. println( "companion init 1\n")
  13. }
  14. init {
  15. println( "companion init 2\n")
  16. }
  17. /* 伴生对象中不允许有构造函数
  18. constructor() {
  19. println("companion constructor\n")
  20. } */
  21. }
  22. /*初始化代码块*/
  23. init {
  24. println( "init 2, from:${from}\n")
  25. }
  26. /*初始化代码块*/
  27. init {
  28. println( "init 1, from:${from}\n")
  29. }
  30. }
  31. fun main(args: Array<String>) {
  32. println( "调用次构造方法:\n")
  33. Person( "main1", "name1")
  34. println( "\n\n调用主构造方法:\n")
  35. Person( "main2")
  36. }

 

结果1: 


  
  1. 调用次构造方法:
  2. init 2, from:companion
  3. init 1, from:companion
  4. companion init 1
  5. companion init 2
  6. init 2, from:main1
  7. init 1, from:main1
  8. constructor, from:main1
  9. 调用主构造方法:
  10. init 2, from:main2
  11. init 1, from:main2

 

测试代码2:

如果把main函数改成: 


  
  1. fun main(args: Array<String>) {
  2. println( "\n\n调用主构造方法:\n")
  3. Person( "main2")
  4. println( "\n\n调用次构造方法:\n")
  5. Person( "main1", "name1")
  6. }

 

结果2: 


  
  1. 调用主构造方法:
  2. init 2, from:companion
  3. init 1, from:companion
  4. companion init 1
  5. companion init 2
  6. init 2, from:main2
  7. init 1, from:main2
  8. 调用次构造方法:
  9. init 2, from:main1
  10. init 1, from:main1
  11. constructor, from:main1

 

结论--执行顺序: 

1. 伴生对象中成员变量初始化

2. 伴生对象中init代码块按先后顺序执行

3. 类的init代码块按先后顺序执行

4. 类的主构造函数

5. 类的次构造函数

 

 

结论--跟java的比较, 特点, 使用场景: 

 

1.  kotlin的伴生对象(companion object)相当于java中的静态初始化块(static {}), 只被同个类的所有实例的第一个实例执行一次, 用于静态成员变量初始化和初始化代码

2. kotlin的init代码块(init {})相当于java的非静态初始化块({}), 每个类实例都会执行, 且按先后顺序执行, 用于对多个构造函数的代码复用

3. kotlin的主构造函数, 在java中没有, 比次构造函数(constructor)先执行 (从次构造函数需要继承 : this()主构造函数已经可以推测是主构造函数先执行), 每个类实例都会执行, 用于类成员变量的声明/赋值, 由于没有代码块, 所以不能做其他初始化逻辑

4. kotlin的次构造函数(constructor)相当于java的构造函数, 函数签名要跟主构造函数不一样, 否则报错, 可以重载出多个次构造函数, 用于类初始化, 由于有代码块, 所以可以做其他初始化逻辑

 

 

Java的初始化块、静态初始化块、构造函数的执行顺序及用途


https://blog.csdn.net/guyue35/article/details/105094901

 

 

 


转载:https://blog.csdn.net/guyue35/article/details/105097609
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场