1

次のコードを検討してください:-

class Name {

    {System.out.println("hi");}

    public static void main(String[] args) {
        System.out.println(waffle());
    }

    static boolean waffle() {
        try {
            return true;
        } finally {
            return false;
        }
    }
}

これは "hi" を出力しません。どうしてこれなの?

4

3 に答える 3

24

中括弧内のコードはインスタンスの初期化子です。

Java 言語仕様、第 3 版セクション 8.6から:

クラスで宣言されたインスタンス初期化子は、§8.8.5.1 で指定されているように、クラスのインスタンスが作成されるときに実行されます (§15.9)。

Nameクラスが実行されると、public static void main(String[])Java 仮想マシンによってメソッドが呼び出されますが、Nameクラスはインスタンス化されないため、インスタンス初期化子のコードは実行されません。

外観はインスタンス初期化子に似ていますが、static前にキーワードがあります。

static {
    // Executed when a class is first accessed.
}

繰り返しますが、Java 言語仕様、第 3 版セクション 8.7から:

クラスで宣言されたすべての静的初期化子は、クラスが初期化されるときに実行され、クラス変数のフィールド初期化子 (§8.3.2) とともに、クラスのクラス変数を初期化するために使用できます (§12.4)。

The Java TutorialsのInitializing Fieldsページにも、静的ブロックとインスタンス初期化ブロックに関する情報があります。

于 2009-08-29T13:08:13.897 に答える
1

インスタンスの作成時にのみアクティブになると思います。static { ... } として実行してみてください

于 2009-08-29T13:10:17.470 に答える
1

ブロックを実行するには、ブロックを static として宣言する必要があります。つまり、 static{System.out.println("hi");}

于 2009-08-29T13:11:03.587 に答える