継承初期化

3088 ワード

継承を含む初期化プロセス全体を認識する必要があり,このプロセスで発生したことに対して全体的な概念がある.次のコードを参照してください.
package ttt;

class Insect {
    int i = 9;
    int j;

    Insect() {
        prt("i = " + i + ", j = " + j);
        j = 39;
    }

    static int x1 = prt("static Insect.x1 initialized");

    static int prt(String s) {
        System.out.println(s);
        return 47;
    }
}

public class Beetle extends Insect {
    int k = prt("Beetle.k initialized");

    Beetle() {
        prt("k = " + k);
        prt("j = " + j);
    }

    static int x2 = prt("static Beetle.x2 initialized");

    static int prt(String s) {
        System.out.println(s);
        return 63;
    }

    public static void main(String[] args) {
        prt("Beetle constructor");
        Beetle b = new Beetle();
    }
}

プログラムの出力は次のとおりです.
static Insect.x1 initialized static Beetle.x2 initialized Beetle constructor i = 9, j = 0 Beetle.k initialized k = 63 j = 39
Beetleに対してJavaを実行するとき、最初に発生したことは、プログラムをロードしてそのクラスを外に見つけることです.に服を着せる
ロード中、マウント・プログラムは、extendsキーワードが表す意味という基礎クラスがあることに注意します.
だからそれを載せる.そのベースクラスのオブジェクトを生成する準備ができているかどうかにかかわらず、これは
スレッドが発生します(オブジェクトの作成コードをコメントとしてマークしてみて、自分で確認してください).若基
ベースクラスに別のベースクラスが含まれている場合、別のベースクラスもロードされます.これから
ルートベースクラス(この場合はInsect)でstatic初期化を実行し、次の派生クラスで実行します.
このようなプッシュ.この順序を保証することは、派生クラスの初期化がベースクラスに依存する可能性があるため、非常に重要です.
メンバーの正しい初期化.この場合、必要なクラスはすべてマウント済みなので、オブジェクトを作成できます.
まず、このオブジェクトのすべての基本データ型がデフォルト値に設定され、オブジェクトハンドルが設定されます.
はnullです.次に、ベースクラスビルダーが呼び出されます.この場合、呼び出しは自動的に行われます.でも
ビルダー呼び出し(Beetle()ビルダーの最初の操作のようにsuperで自分で指定することができます.
様).ベースクラスの構築は、派生クラスビルダーと全く同じ処理プロセスを採用します.インフラストラクチャー完了
以降,インスタンス変数は本来の順序で初期化される.最後に、コンストラクタの残りのマスターを実行します.
体の部分.
本文は『think in java』第4版6.9.1章から抜粋して読んで感銘を受け、以下の作品を抜粋してマークした.