Java和Kotlin类的初始化顺序

作者: 魏树鑫 | 来源:发表于2019-04-26 20:51 被阅读7次

Java

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

Java程序初始化一般遵循3个原则:

  1. 静态对象(变量)先于非静态对象(变量)初始化。其中静态对象(变量)只初始化一次,因为static在jvm中只有一块区域存储,方法区(Method Area),
    他之所以被称为静态是因为从程序创建到死亡他的地址值都不会改变,他只在class类对象初次加载时初始化,因此static只需要初始化一次,而非静态对象(变量)可能会初始化很多次。
  2. 如果类之间存在继承关系,那么父类优先于子类进行初始化。
  3. 按照成员变量的定义顺序进行初始化。即使变量定义散布于方法之中,他们依然在任何方法(包括构造函数)被调用前先初始化

Kotlin

init关键字==>java方法块
companion object伴生对象==>java静态方法,伴生对象中的init方法==>java静态代码块

internal open class ClassLoaderA {
    init {
        print("2")
    }
    init {
        print("3")
    }
    constructor() {
        print("5")
    }
    constructor(name: String) : this() {
        print("6")
    }
    constructor(name: String, id: String) {
        print("7")
    }
    open fun print() {
        print("4")
    }
    companion object {
        init {
            print("1")
        }
    }
}

internal class ClassLoaderB : ClassLoaderA("s") {
    init {
        print("b")
    }
    init {
        print("c")
    }
    override fun print() {
        print("d")
    }
    companion object {
        init {
            print("a")
        }
    }
}

object Hello {
    @JvmStatic
    fun main(args: Array<String>) {
        var classLoaderB: ClassLoaderA = ClassLoaderB()
        classLoaderB.print()
        println()
        classLoaderB = ClassLoaderB()
    }
//结果输出
1a2356bcd
2356bc

相关文章

  • Java和Kotlin类的初始化顺序

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

  • Kotlin记录

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

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

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

  • Kotlin笔记

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

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

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

  • 类初始化和加载过程

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

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

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

  • JAVA的类加载顺序

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

  • java反射机制

    一、java类初始化 初始化操作:按照源代码从上到下的顺序依次执行静态代码块和初始化静态域。在一个类被初始化前,其...

  • Java初始化顺序

    Java初始化顺序:①类变量、类方法>②(父类代码)>③实例变量>④构造器当一个类要实例化时,static变量和方...

网友评论

    本文标题:Java和Kotlin类的初始化顺序

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