(三)『Javaプログラミング思想』——構造関数の初期化


1.初期化順序は、クラス内の変数の定義順序によって決定され、構造関数が呼び出される前に変数を初期化します.
package chapter4;



//: OrderOfInitialization.java

/**

 *  

 */

class Tag {

    Tag(int marker) {

        System.out.println("Tag(" + marker + ")");

    }

}



class Card {

    Tag t1 = new Tag(1); // Before constructor



    Card() {

        // Indicate we're in the constructor:

        System.out.println("Card()");

        t3 = new Tag(33); // Re-initialize t3

    }



    Tag t2 = new Tag(2); // After constructor



    void f() {

        System.out.println("f()");

    }



    Tag t3 = new Tag(3); // At end

}



public class OrderOfInitialization {

    public static void main(String[] args) {

        Card t = new Card();

        t.f(); // Shows that construction is done

    }



} // /:~

【運転結果】:
Tag(1)Tag(2)Tag(3)Card()Tag(33)f()
2.静的データの初期化
まずmain関数が存在するクラスを見てみましょう.mainはプログラムのエントリであり、すべてのオブジェクトを呼び出すにはインスタンス化する必要があります.
package chapter4;
public
class StaticInitialization { public static void main(String[] args) { StaticInitialization s = new StaticInitialization(); System.out.println("i="+s.i);
}
int i; }

【運転結果】:i=0
変数が静的である場合、main関数の前に初期化されます.
package chapter4;
public
class StaticInitialization1 { public static void main(String[] args) { System.out.println("i="+i); } static int i=5; }

【運転結果】:i=5
インスタンス化クラスはデフォルトでコンストラクション関数を呼び出します
package chapter4;
class
Table { Table() { System.out.println("Table()"); } } public class StaticInitialization1 { public static void main(String[] args) { Table t2 = new Table(); } }

【運転結果】:Table()
変数が静的である場合、main関数の前に初期化されます.クラスにも適用されます(クラスはカスタム変数です)
package chapter4;
class
Table { Table() { System.out.println("Table()"); } } public class StaticInitialization1 { public static void main(String[] args) { } static Table t2 = new Table(); }

【運転結果】:Table()
クラス内の変数、静的変数の初期化、およびコンストラクション関数の呼び出し順序:
静的変数、変数、構造関数
package chapter4;



class Bowl {

    Bowl(int marker) {

        System.out.println("Bowl(" + marker + ")");

    }

}

class Table {

    Bowl b1 = new Bowl(1);



    Table() {

        System.out.println("Table()");

    }



    static Bowl b2 = new Bowl(2);

}



public class StaticInitialization1 {

    public static void main(String[] args) {



    }



    static Table t2 = new Table();

}

【運転結果】:
Bowl(2)Bowl(1)Table()
static初期化は1回のみ発生します
package chapter4;



class Bowl {

    Bowl(int marker) {

        System.out.println("Bowl(" + marker + ")");

    }



    void f(int marker) {

        System.out.println("f(" + marker + ")");

    }

}



class Table {

    Bowl b1 = new Bowl(1);



    Table() {

        System.out.println("Table()");

    }



    void f2(int marker) {

        System.out.println("f2(" + marker + ")");

    }



    static Bowl b2 = new Bowl(2);

}



public class StaticInitialization1 {

    public static void main(String[] args) {

        System.out.println("=========main===========");

        Table t3 = new Table();

        t2.f2(2);

    }



    static Table t2 = new Table();

}

【運転結果】:
Bowl(2)Bowl(1)Table()=========main===========Bowl(1)Table()f2(2)
静的ブロック:そのクラスのオブジェクトを初めて生成したとき、またはそのクラスに属するstaticメンバーに初めてアクセスしたときにのみ実行されます.
//: ExplicitStatic.java

// Explicit static initialization

// with the "static" clause.

class Cup {

Cup(int marker) {

System.out.println("Cup(" + marker + ")");

}

void f(int marker) {

System.out.println("f(" + marker + ")");

}

}

class Cups {

static Cup c1;

static Cup c2;

static {

c1 = new Cup(1);

c2 = new Cup(2);

}

Cups() {

System.out.println("Cups()");

115

}

}

public class ExplicitStatic {

public static void main(String[] args) {

System.out.println("Inside main()");

Cups.c1.f(99); // (1)

}

static Cups x = new Cups(); // (2)

static Cups y = new Cups(); // (2)

} ///:~

【運転結果】:
Cup(1)Cup(2)Cups()Cups()Inside main()f(99)
非静的インスタンスの初期化は、静的ブロックと同様の形式で定義することができる.
package chapter4;



//: Mugs.java

// Java 1.1 "Instance Initialization"

class Mug {

    Mug(int marker) {

        System.out.println("Mug(" + marker + ")");

    }

}



public class Mugs {

    Mug c1;

    Mug c2;

    {

        c1 = new Mug(1);

        c2 = new Mug(2);

        System.out.println("c1 & c2 initialized");

    }



    Mugs() {

        System.out.println("Mugs()");

    }



    public static void main(String[] args) {

        System.out.println("Inside main()");

        Mugs x = new Mugs();

    }

} // /:~

【運転結果】:
Inside main()Mug(1)Mug(2)c1 & c2 initializedMugs()
この定義コード
{        c1 = new Mug(1);        c2 = new Mug(2);        System.out.println("c1 & c2 initialized");    }
静的初期化従文と極めて似ているように見えますが、staticキーワードが消えています.匿名の内部クラスの初期化をサポートするには、この構文フォーマットを使用する必要があります.