6
public class Main {
    public static final Logger LOGGER = Logger.getLogger(Main.class.getName());

    static {
        try {
             LOGGER.addHandler(new FileHandler("errors.log",true));
        }
        catch(IOException ex) {
             LOGGER.log(Level.WARNING,ex.toString(),ex);
        }
    }
...

この名前のない静的関数は何なのか疑問に思っています。

私はJavaでこのようなものを見たことがありません(私は現在学んでいます)。

それはなんのためですか ?

通常はいつ使用されますか?

これはプログラムでいつ実行されますか?

4

6 に答える 6

8

これは静的ブロックと呼ばれ、初期化中に1回だけ実行されます。また、静的初期化ブロックが複数ある場合、ランタイムは、それらがソースコードに表示される順序で呼び出されることを保証します。

これは、いくつかのサンプルコードを使用したかなり良い説明です。 https://www.geeksforgeeks.org/g-fact-79/

于 2011-04-12T12:40:12.393 に答える
3

クラスがロードされるときに1回実行されます。この特定のケースでは、アプリケーションのロガーを設定します。

于 2011-04-12T12:31:57.827 に答える
3

静的メンバー変数は静的ブロックでのみ操作できます。また、コンストラクターを複数回呼び出しても、静的ブロックはJVMで 1 回しか実行されないことを通知します。

なぜ静的ブロックが必要なのですか? コンストラクター内でstatic finalメンバー変数を初期化できないため、意味がありません。

したがって、静的変数はインスタンスごとに作成されるため、コンストラクターで初期化できます。また、静的ブロック内で静的最終変数を初期化する必要があります。非最終静的メンバー変数の初期化は、静的ブロック内に記述できるかどうかのいずれかであり、それは選択です。作成時に各インスタンスで同じ値を初期化したい場合は、コンストラクタ内で静的変数を割り当てて静的変数をリセットします。静的変数を一度だけ設定したい場合は、それが最終メンバー変数でなくても、静的ブロック内に init ステートメントを記述する必要があります。

これは簡単なデモです。

A - 静的初期化ブロックを含むサンプル モデル クラス

public class SampleModel {

    private int index;                          // Will be init within the constructor
    private static final int MAX_VALUE;         // Will be init within static block
    private static String messageOfTheDay;      // Will be init within static block

    // Argument Constructor
    public SampleModel(int index) { 
        this.index = index;
        System.out.println("Constructor called");
    }

    // static block, will be run only once!
    static {
        System.out.println("WARNING: Static Block called !");

        MAX_VALUE = 69;
        messageOfTheDay = "I'm here";
    }

    public String getMessageOfTheDay() {
        return messageOfTheDay;
    }

    public int getMaxValue() {
        return MAX_VALUE;
    }

    public int getIndex() {
        return index;
    }

}

B - デモコード

public class StaticBlockDemo {

    public static void main(String[] args) {
        SampleModel obj1 = new SampleModel(1);
        SampleModel obj2 = new SampleModel(2);
        SampleModel obj3 = new SampleModel(3);

        System.out.println();
        System.out.println( "obj1 : index    : " + obj1.getIndex() );
        System.out.println( "obj1 : Max Value: " + obj1.getMaxValue() );
        System.out.println( "obj1 : Max MOTD : " + obj1.getMessageOfTheDay() + "\n");

        System.out.println( "obj2 : index    : " + obj2.getIndex() );
        System.out.println( "obj2 : Max Value: " + obj2.getMaxValue() );
        System.out.println( "obj2 : Max MOTD : " + obj2.getMessageOfTheDay() + "\n");

        System.out.println( "obj3 : index    : " + obj3.getIndex() );
        System.out.println( "obj3 : Max Value: " + obj3.getMaxValue() );
        System.out.println( "obj3 : Max MOTD : " + obj3.getMessageOfTheDay() + "\n");

    }

}

C - 出力

WARNING: Static Block called !
Constructor called
Constructor called
Constructor called

obj1 : index    : 1
obj1 : Max Value: 69
obj1 : Max MOTD : I'm here

obj2 : index    : 2
obj2 : Max Value: 69
obj2 : Max MOTD : I'm here

obj3 : index    : 3
obj3 : Max Value: 69
obj3 : Max MOTD : I'm here

出力では、コンストラクターは 3 回呼び出されますが、静的ブロックは 1 回しか呼び出されないことを通知します。

于 2016-05-11T02:32:57.123 に答える
0

これは、クラスのロード時に 1 回実行される静的初期化ブロックです。静的メンバー変数の初期化に使用できます。

于 2011-04-12T12:34:12.330 に答える
0

クラスの初期化中に実行されるstatic initializerです。ご覧のとおり、その段階で例外処理を含む複雑なロジックを実行できます。

于 2011-04-12T12:34:20.087 に答える
0

これは初期化ブロックであり、クラスのロード時に呼び出されます。

于 2011-04-12T12:34:32.597 に答える