Javaクラスのロードとインスタンス化の実行順序の詳細

10382 ワード

≪クラス・ロード|Class Load|emdw≫:プログラムがクラスをアクティブに使用する場合、クラスがメモリにロードされていない場合、システムはロード、リンク、初期化の3つのステップでクラスを初期化し、JVMは3つのステップを連続的に完了し、総称してクラス・ロードまたはクラス初期化と呼ばれます.≪クラスをロードするタイミング|Load Class Time|emdw≫:クラス情報を最初に使用する必要がある場合にロードします.クラスロードの原則:遅延ロード、ロードしないでロードしないことができます.クラスのロードをトリガーするいくつかの状況:(1)静的メンバーを呼び出すと、静的メンバーが本当に存在するクラスとその親がロードされます.サブクラスで親の静的メンバーを呼び出すと、親のみがロードされ、子クラス(2)の最初のnewオブジェクトがロードされないときにロードされ、後で(3)子クラスを再ロードする必要がなく、親がロードされます.
ロードメソッドは実行メソッドに等しくなく、初期化変数には値が割り当てられます.クラス・ロードの順序は、「静的メソッドのロード」>「静的変数の初期化」>「静的コード・ブロックのインスタンス化を実行する場合、非静的メソッドのロード」>「非静的変数のインスタンス化」>「コード・ブロックの構築の実行」>「構造関数の実行」です.
public class InitializeDemo {
     
    //      
    private static int k = 1;
    //      
    /**
     * new      ,       
     * 1.       :{   print("   ");  j=100; }
     * 2.        : private int j = print("j");
     * 3.       ::    i= n=
     * 4.      :private static InitializeDemo t1= new InitializeDemo("t1");
     */
    private static InitializeDemo t1= new InitializeDemo("t1");
    //     ,      
    private static InitializeDemo t2= new InitializeDemo("t2");
    //        :i i= 6  n = 6
    private static int i = print("i");
    //             
    static {
     
        print("   ");
        n = 100;
    }
    //     
    private static int n = 99;
    //     
    {
     
        print("   ");
        j=100;
    }
    public InitializeDemo(String str) {
     
        System.out.println((k++) + ":" + str + " i= " + i + "  n = " + n);
        ++i;
        ++n;
    }
    //     :               ,           (   ,        )
    private int j = print("j");
    public static int print(String str) {
     
        System.out.println((k++) + ":" + str + " i= " + i + "  n = " + n);
        ++n;
        return ++i;
    }
        public static void main(String[] args) {
     
            InitializeDemo n = new InitializeDemo("   ");
        }
    }

結果は次のとおりです.
1:    i= 0  n = 0
2:j i= 1  n = 1
3:t1 i= 2  n = 2
4:    i= 3  n = 3
5:j i= 4  n = 4
6:t2 i= 5  n = 5
7:i i= 6  n = 6
8:    i= 7  n = 7
9:    i= 8  n = 99
10:j i= 9  n = 100
11:    i= 10  n = 101