[メモ]Static初期化に関する小さな記憶

4520 ワード

Q 1:次のコードを見て、出力結果を分析しますか?
public class Test {
    static {
        System.out.println("static");//-----1
    }
    public Test() {
        System.out.println("Test");//-----2
    }
    public static void main(String[] args) {
        Test test = new Test();
    }
}

A:
static
Test

Thinking:スタティックコードブロックはコンストラクタより先に実行されます.
Q 2:下記のコードを見て、出力結果を分析しますか?
public class Test {

    static Test test1 = new Test();//-----1
    static {
        System.out.println("static");//-----2
    }
    public Test() {//-----3
        System.out.println("Test");
    }
    public static void main(String[] args) {
        Test test1 = new Test();
    }
}

A:
Test
static
Test

Q:次のコードを見て、出力結果を分析しますか?
public class Test {


    static {
        System.out.println("static");//-----1
    }
    public Test() {//-----3
        System.out.println("Test");
    }
    public static void main(String[] args) {
        Test test1 = new Test();
    }
    static Test test1 = new Test();//-----2
}

A:
static
Test
Test

Thinking:静的コードブロックは順番に実行されます.
Q 3:下記のコードを見て、出力結果を分析しますか?
public class Test {


    static {
        System.out.println("static");//-----1
    }

    public Test() {//------3,4
        System.out.println("Test");
    }

    public static void main(String[] args) {
        Test test1 = new Test();
        Test test2 = new Test();
    }
    static Test test1 = new Test();//-----2
}

A:
static
Test
Test
Test

Thinking:スタティックコードブロックはクラスロード時に一度だけ初期化され、その後は実行されません.
まとめ:static修飾の変数は、コンストラクタの前(クラスがstatic修飾でない限りQ 1のように)に順次初期化され、1回のみロードされます.
tip:筆者の経験は非常に限られていますが、間違いや説明が間違っている場合は、軽く噴き出してください....