3

私は次のクラスを持っています:

public abstract class A()
{
   public static final SomeString = null;

   static()
   {
       SomeString = "aaa";
   }
}

この静的メソッドはいつ、どのように呼び出されますか?

そのような静的メソッド (名前/戻り値なし) を作成する目的は何ですか?

4

4 に答える 4

7

それはメソッドではなく、静的初期化ブロックであり、構文が間違っています

public abstract class A()
{
   public static String SomeString = null;

   static
   {
       SomeString = "aaa";
   }
}

宣言時に Java でフィールド (静的またはインスタンス) を初期化する最も簡単な方法は、互換性のあるデータ型のコンパイル時の定数値を提供することです。例えば:

public class InitializationWithConstants{

public static int staticIntField = 100;
private boolean instanceBoolField = true;

}

このタイプの初期化には、単純さゆえに制限があり、複雑な配列の選択された要素のみを for ループでロジックを使用して初期化するような、ある程度複雑なロジックに基づく初期化をサポートすることはできません。

ここで、静的フィールドとインスタンス フィールドをそれぞれ初期化するための静的初期化ブロックと初期化ブロックが必要になります。

これは、1 対の中かっこで囲まれ、前に「static」キーワードが続く通常のコード ブロックです。これらのブロックは、フィールドまたはメソッドを持つことができるクラス定義のどこにでも置くことができます。Java ランタイムは、すべての静的初期化ブロックがソース コードに表示される順序で呼び出されることを保証します。これは、クラスをメモリにロードするときに発生します。

public class InitializationWithStaticInitBlock{

public static int staticIntField;
private boolean instanceBoolField = true;

static{
 //compute the value of an int variable 'x'
 staticIntField = x;
}
}

静的初期化ブロックは実際にはコードブロックであるため、初期値を取得するために何らかの論理処理を行う必要がある静的フィールドも初期化できます。

于 2011-11-03T07:43:09.070 に答える
0

構文が正しくありません。そのはず:

public abstract class A()
{
    public static final String SomeString;

    static
    {
        SomeString = "aaa";
    }
}

このstaticブロックでは、クラスのロード時に静的変数を初期化することができますが、その初期化は単純なものよりも複雑です= something;

参照

于 2011-11-03T07:42:36.470 に答える
0

構文はさておき、静的初期化ブロックを見ています。ここに記載されています。

基本的に、静的初期化ブロックは、クラスがロードされたときに実行されるコードの一部であり、クラスの静的フィールドを初期化するために使用できます。

例:

public abstract class A
{
    public static final String SomeString;

    static
    {
        System.out.println("static{}");    
        SomeString = "aaa";
    }    

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

出力:

static{}
main
于 2011-11-03T07:46:02.010 に答える
0

はい、それはメソッドではありません。それは静的ブロックであり、所有者クラスがロードされるときに一度評価されます。
静的変数を動的に初期化するために使用できます...

于 2011-11-03T07:46:58.120 に答える