2

重複の可能性:
静的初期化ブロック
異常な「静的」メソッド宣言

近い将来、OCJPCの準備をしようとしていますが、今まで見たことのない構造に出くわしました。プログラミング構造をグーグルで検索するのは難しいので、ここで質問します。コードフラグメント:

class Geryon {
    static { System.out.print("a"); }
    { System.out.print("b"); }
    Geryon(String s) { System.out.print(s); }

    public static void main(String[] args) {
        new Geryon("c");
    }
}

theGeryon()戻り型を期待する場所で、メソッドヘッダー内の2つのprintステートメントを参照しています。私がグーグルできた限り、静的メソッドヘッダーは以下で構成されています:

access-modifier keyword-"static" return-type|void method-name

クイズの質問への回答から判断すると、コードはコンパイルされるだけでなく、実行されます。誰かがこれが説明されている情報源に私を導くことができますか?

4

1 に答える 1

6

Aは、クラスがクラスローダーによって初期化されるときに呼び出される静的初期化子です。

 static { System.out.print("a"); }

もう1つ(B)は、クラスがインスタンス化されるたびに呼び出される匿名ブロックです。

{ System.out.print("b"); }

ああ、3番目のprintステートメントCは、通常のコンストラクター呼び出しです。

投稿したコードのように、1つのGeryonをインスタンス化すると、3行すべてが表示されます。しかし、次にGeryonをインスタンス化したときは、BとCの2つしか取得できません。クラスローダーによってすでに初期化されているため、静的ブロックは呼び出されません。

于 2012-10-16T07:59:49.837 に答える