美文网首页
Java 和 kotlin类初始化顺序对比

Java 和 kotlin类初始化顺序对比

作者: emdd2016 | 来源:发表于2021-09-08 17:14 被阅读0次

知识点:

  1. 静态代码块只执行一次 。
  2. kotlin 中每个次构造函数都需要委托给主构造函数,可以直接委托也可以通过其他的构造函数间接委托。
  3. Java中 构造函数不能被继承,只能被子类调用。如果子类没有用super显示调用则会隐式调用父类构造。如果父类没有构造,则会调用父类默认构造。

1. kotlin中

1.1 在kotlin中执行顺序

  1. 父类的静态代码块 companion object
  2. 子类的静态代码块
  3. 父类的主构造函数
  4. 按定义顺序执行父类的init初始化块儿和属性初始化器
  5. 父类的次构造函数
  6. 子类的主构造函数
  7. 按定义顺序执行子类的init初始化块儿和属性初始化器
  8. 子类的次构造函数

1.2 怎样验证呢?

父类

public open class GenerParent(info: String) {
    // 有参构造
    constructor(info: String, name: String) : this(info) {
        println("GenerParent 次构造函数 $name $info ")
    }
    // 属性初始化器  --- 在这里能输出info的值说明主构造函数已经执行过了
    var info: String =
        info.also { println("GenerParent 中初始化info:$info") }

    // 静态代码
    companion object {
        val PARNTID = 100001.also { println("GenerParent companion object ") }
    }
}

子类,
在KOTLIN中每个次构造函数都需要委托给主构造函数,可以直接委托也可以通过其他的构造函数间接委托。

public class GenerChild(info: String, var name:String) : GenerParent(info, name) {
    // 无参构造函数
    constructor():this("default info", "default name"){
        println("GenerChild 无参的次构造函数")
    }
    // 有参构造
    constructor(info:String, id:Int):this(info, "default-name"){
        println("GenerChild 的次构造函数 name ${name}")
    }
    // 属性和init按定义的顺序执行,在主构造函数之后,次构造函数之前
    init {
        println("GenerChild 初始化init代码块")
    }
    // 这个相当于静态代码块,最先执行 --1
    companion object {
        var CODE:Int = 888.also { println("GenerChild object combine 初始化") }
    }
}
fun main(a:Array<String>){
    GenerChild("对酒当歌,人生几何。", "曹操")
    println("---------------------------------")
    GenerChild("譬如朝露,去日苦多。", 1001)
    println("---------------------------------")
    GenerChild()
}

输出:

GenerParent companion object 
GenerChild object combine 初始化
GenerParent 中初始化info:对酒当歌,人生几何。
GenerParent 次构造函数 曹操 对酒当歌,人生几何。 
GenerChild 初始化init代码块
---------------------------------
GenerParent 中初始化info:譬如朝露,去日苦多。
GenerParent 次构造函数 default-name 譬如朝露,去日苦多。 
GenerChild 初始化init代码块
GenerChild 的次构造函数 name default-name
---------------------------------
GenerParent 中初始化info:default info
GenerParent 次构造函数 default name default info 
GenerChild 初始化init代码块
GenerChild 无参的次构造函数

// ---------------------------------------------------------------------

2. Java中

2.1 调用顺序

  1. 父类中的静态
  2. 子类中的静态
  3. 父类构造函数
  4. 子类构造函数。如果子类中不用super调用父类构造,则它会默认先调用父类构造

2.2 如何验证

父类

public class JavaParent {
    JavaParent() {
        System.out.println("JavaParent 构造");
    }

    JavaParent(String info) {
        System.out.println("JavaParent 有参构造 " + info);
    }

    static {
        System.out.println("JavaParent 静态代码块");
    }
}

子类
// 子类的构造方法中如果不用super调用父类的构造,它会默认调用父类的构造

public class JavaChild extends JavaParent {
    JavaChild() {
        System.out.println("JavaChild 构造");
    }

    JavaChild(String info) {
        System.out.println("JavaChild 有参构造");
    }

    static {
        System.out.println("JavaChild 静态代码块");
    }

}

// 调用

void main(){
    new JavaChild()  
    System.out.println("--------------------------")
    new JavaChild("java-info")  
}

输出

JavaParent 静态代码块
JavaChild 静态代码块
JavaParent 构造
JavaChild 构造
--------------------------
JavaParent 构造
JavaChild 有参构造

个人学习记录用,有错误请指出 <<<<<

相关文章

  • Java 和 kotlin类初始化顺序对比

    知识点: 静态代码块只执行一次 。kotlin 中每个次构造函数都需要委托给主构造函数,可以直接委托也可以通过其他...

  • Kotlin 数据类 以及copy方法

    数据类的创建是避免不了的,我们对比一下原有java和kotlin的数据类的区别 java Kotlin data ...

  • Kotlin记录

    1. kotlin类的调用顺序调用顺序 答:变量初始化 --> init{} --> constractor{} ...

  • Java和Kotlin类的初始化顺序

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

  • Kotlin笔记

    Kotlin与Java的差异 1. 对象的初始化时的顺序 在java中,初始化代码块 -> 构造函数 在kotli...

  • kotlin调Java代码和调kotlin代码总结

    java类参数和kotlin类为参数区别 kotlin使用Java代码的callback kotlin使用kotl...

  • 构造器内部的多态方法的行为

    上一篇 :Java类初始化顺序 上一节我们简单总结了类的初始化顺序。父类(静态变量、静态初始化块)>子类(静态变量...

  • 类初始化和加载过程

    一、对象的初始化顺序: java类加载器加载类的顺序:http://blog.csdn.net/crazycode...

  • Kotlin基础---函数

    《基于Kotlin实战》 1.普通的Java函数 2.Kotlin函数 3.对比Kotlin代码和Java代码 一...

  • JAVA的类加载顺序

    理解关于java类的加载顺序 首先来捋一捋java类的加载顺序吧 父类静态代码块 》》静态代码初始化,静态属性(带...

网友评论

      本文标题:Java 和 kotlin类初始化顺序对比

      本文链接:https://www.haomeiwen.com/subject/fewvwltx.html