102

以下のコードを見ていると、少し奇妙なことがわかりました。

public class Sequence {
    Sequence() {
        System.out.print("c ");
    }

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

    public static void main(String[] args) {
        new Sequence().go();
    }

    void go() {
        System.out.print("g ");
    }

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

System.outwith "y"は{ }. なぜこれが有効なのですか?このコードがどのように呼び出されるか、または呼び出されるべきかわかりません。

これを実行すると、シーケンス コンストラクターの前に get が呼び出されるのx y c gはなぜですか?static { }

4

8 に答える 8

149

これ:

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

静的初期化ブロックであり、クラスがロードされるときに呼び出されます。クラスには必要なだけそれらを含めることができ、それらは出現順に (上から下へ) 実行されます。

これ:

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

初期化ブロックであり、コードはクラスの各コンストラクターの先頭にコピーされます。したがって、クラスのコンストラクターが多数あり、それらすべてが最初に共通の処理を行う必要がある場合は、コードを 1 回記述して、このような初期化ブロックに配置するだけで済みます。

したがって、出力は完全に理にかなっています。

Stanleyが以下にコメントしたように、詳細については、初期化ブロックについて説明している Oracle チュートリアルのセクションを参照しください。

于 2012-12-04T08:56:24.853 に答える
25

メソッドではなく、初期化ブロックです。

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

コンストラクター呼び出しの前に実行されます。その間

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

クラスローダーによってクラスがロードされたときに実行される静的初期化ブロックです。

したがって、コードを実行すると

  1. クラスはクラス・ローダーによってロードされるため、静的初期化ブロックが実行されます
    出力: x が出力されます
  2. オブジェクトが作成されるため、初期化ブロックが実行され、コンストラクターが呼び出されます
    出力: y が出力され、その後に c が続きます
  3. main メソッドが呼び出され、次に go メソッドが呼び出されます
    出力: g が出力されます

最終出力: xycg
これは役立つかもしれませんhttp://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/

于 2012-12-04T08:56:35.063 に答える
16

これは、インスタンス初期化ブロックの後に静的初期化ブロックが続きます。

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

クラスのインスタンスを作成するときに呼び出されます。

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

クラスローダーによってクラスがロードされたときに呼び出されます。だからあなたがするとき

new Sequence().go();

クラスがロードされるので、クラスがstatic {}実行され、インスタンスの初期化ブロックが実行{}されます。その後、コンストラクターの本体が呼び出され、次に新しく作成されたインスタンスのメソッドが呼び出されます。出力エルゴx y c g

于 2012-12-04T08:57:16.913 に答える
15
static {
        System.out.print("x ");
    }

静的ブロックであり、クラスのロード中に呼び出されます

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

初期化ブロックです

クラスに複数の初期化ブロックを含めることができます。その場合、それらはクラスに表示される順序で実行されます。

クラスに存在する初期化ブロックは、コンストラクターの前に実行されることに注意してください。

于 2012-12-04T08:58:36.237 に答える
10
static {
      System.out.print("x ");
}

static最初に実行される、クラスによって共有される初期化ブロック ( で示される) です。

{
        System.out.print("y ");

}

次に来るクラスのすべてのオブジェクト(コンストラクター)によって共有される初期化ブロックです。

Sequence() {
        System.out.print("c ");
}

クラスの特定のコンストラクタで、3 番目に実行されます。インスタンス初期化ブロックは、コンストラクターが実行されるたびに最初に呼び出されます。そのため、「c」の直前に「y」が来ます。

void go() {
        System.out.print("g ");
}

上記のコンストラクターを使用して構築されたオブジェクトに関連付けられた単なるインスタンスメソッドであり、最後に来ます。

于 2012-12-04T09:04:59.040 に答える
9
{
    System.out.print("y ");
}

これらの種類のブロックは と呼ばれinitializer blockます。のインスタンスを作成するたびに実行されますclass。コンパイル時に、このコードはクラスのすべてのコンストラクターに移動されます。

ブロックの場合static initializer: -

static {
    System.out.println("x ");
}

クラスがロードされるときに一度実行されます。通常、フィールドstaticの初期化に複数の手順が必要な場合は、初期化ブロックを使用します。static

于 2012-12-04T08:57:29.890 に答える
6

これは初期化ブロックとして使用され、静的宣言の後に実行されます。シングルトンデザイン パターンの場合と同様に、他の誰もクラスのインスタンスを作成できないようにするために使用できます (プライベート コンストラクターを使用するのと同じ方法で) 。

于 2012-12-04T08:59:01.710 に答える
3
static {
    System.out.print("x ");
}

Static blocksJRE によってクラスがロードおよび初期化されるときに 1 回だけ実行されます。

また、新しいインスタンスを作成するたびにnon-staticブロックが呼び出され、コンストラクターの直前に呼び出されます。

ここでは、そのように構築された 1 つのインスタンスのみを作成し、ブロックのSequence後に呼び出されてからnon-static、実際の目標であるメソッドが呼び出されました。

于 2012-12-04T08:56:19.470 に答える