JavaクラスとKotlinクラスの初期化順序

7462 ワード

Java
Javaプログラムの初期化の順序:親静的変数->親静的コードブロック->子静的変数->子静的コードブロック->親非静的変数->親非静的コードブロック->親コンストラクタ->子非静的変数->子非静的コードブロック->子コンストラクタ.
Javaプログラムの初期化は一般的に3つの原則に従います.
  • 静的オブジェクト(変数)は、非静的オブジェクト(変数)よりも先に初期化されます.staticはjvmに1つの領域しか格納されていないため、静的オブジェクト(変数)は1回のみ初期化されます.メソッド領域(Method Area)静的と呼ばれるのは、プログラムの作成から死亡までアドレス値が変わらないためであり、classクラスオブジェクトの初回ロード時にのみ初期化されるため、staticは静的オブジェクト(変数)ではなく1回だけ初期化する必要があります.
  • クラス間に継承関係がある場合、親は子よりも優先して初期化されます.
  • は、メンバー変数の定義順に初期化される.変数定義がメソッドに分散する場合でも、構造関数を含む任意のメソッドが呼び出される前に
  • を初期化する.
    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