web-dev-qa-db-ja.com

Javaメソッドを名前なしで呼び出す

私は以下のコードを見ていて、少し奇妙なものを見つけました:

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.outが「y」であるメソッドは、{ }。なぜこれが有効なのですか?このコードがどのように呼び出されるか、または呼び出されるべきかはわかりません。

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

99
david99world

この:

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

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

この:

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

初期化ブロックであり、コードはクラスの各コンストラクターの先頭にコピーされます。したがって、クラスのコンストラクタが多数あり、それらすべてが最初に共通の何かをする必要がある場合、コードを一度書くだけで初期化ブロックに入れる必要がありますこのように。

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

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

147
jlordo

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

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

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

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

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

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

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

25
xyz

インスタンス初期化ブロックに続いて静的初期化ブロックです。

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

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

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

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

new Sequence().go();

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

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

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

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

初期化ブロック

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

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

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

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

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

}

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

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

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

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

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

10
Terry Li
{
    System.out.print("y ");
}

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

static initializerブロックの場合:-

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

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

9
Rohit Jain

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

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

Static blocksは、クラスがロードされるでJREによって初期化されたときに1回だけ実行されます。

そしてnon-staticブロックはcall 新しいインスタンスを作成するたびにになり、Constructorの直前に呼び出されます。

ここでは、Sequenceのインスタンスを1つしか作成していないため、non-staticブロックしてから、実際にあなたの目標とするメソッド。