2

すべてのメソッドの外で誤って {} のペアを作成し、動作しました。

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

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

もちろん、このコードを実行すると、結果は「ddd」になり、新しいインスタンスを作成した場合にのみ「ttt」と書き込まれます。

そして、私がそれstatic {System.out.println("ttt");}を設計通りに動作させると、結果は「ttt」、次に「ddd」になります

これの実用的な使用はありますか?コンストラクターを使用する場合、または作成されたコンストラクターを使用しない場合、なぜ誰かがそれを使用するのでしょうか?

私の印象は次のとおりです。機能しているように見えますが、悪い奇妙な習慣の匂いがします。私は正しいですか?

4

7 に答える 7

4

{}モジュールまたはコード ブロック (メソッド、静的ブロック、クラスなど) のスコープを定義します。

また、すべてのモジュールには、他のモジュールと区別するための名前が必要です。

あなたの場合、単純に置く{}と、コードのブロックを作成しているが名前を付けていないことを意味するため、エラーが発生します。しかし、メソッドの中に入れる{}とうまくいきます。

しかし、そのstatic前にキーワードを置くと、Java で特別な意味を持つ静的ブロックが作成されます。staticこれは、クラスが最初にロードされたときに、ブロック内のすべてが実行されることを意味します。

Java チュートリアル Web サイトの初期化ブロックについては、このリンクを参照してください。

于 2013-04-25T10:05:19.910 に答える
3

これの実用的な使用はありますか?

インスタンス初期化ブロックを利用する「イディオム」が 1 つあります。

 Map mymap = new HashMap() {{put("a", 1); put("b", 2);}};

これは、特定のエントリ セットで初期化されるマップを作成する簡潔な方法です。そして、それを分解するとHashMap、インスタンス初期化ブロックを使用して新しいマップを設定する匿名サブクラスを宣言してインスタンス化しています。


私の印象は次のとおりです。機能しているように見えますが、悪い奇妙な習慣の匂いがします。

それは主観的な発言です。初期化ブロックが悪い/奇妙であると私が考えることができる唯一の合理的な議論は、人々がそれらを使用しないということです。そして、その議論は循環論理のにおいがします。

于 2013-04-25T10:06:52.020 に答える
2

Initializer ブロックに関するすべて

インスタンス変数の初期化ブロックは、静的初期化ブロックと同じように見えますが、 static キーワードはありません。

{

// will execute when intialization

}

Java コンパイラは、イニシャライザ ブロックをすべてのコンストラクタにコピーします。したがって、このアプローチを使用して、複数のコンストラクター間でコードのブロックを共有できます。

于 2013-04-25T10:05:12.783 に答える
1

これらは初期化ブロックと呼ばれます。それらはすべてのコンストラクターとともに呼び出されます。したがって、コンストラクター呼び出しはすべてこのコードを呼び出します。

静的ブロックは、クラスがロードされたときにのみ呼び出されます。

于 2013-04-25T10:04:14.263 に答える
1

通常、コンストラクターでインスタンス変数を初期化するコードを配置する必要があります。コンストラクターを使用してインスタンス変数を初期化する方法には、 と の 2 つがありinitializer blocksますfinal methods

インスタンス変数の初期化ブロックは、静的初期化ブロックと同じように見えますが、 static キーワードはありません。

イニシャライザ ブロックをすべてのJava compilerコンストラクタにコピーします。したがって、このアプローチを使用して、複数のコンストラクター間でコードのブロックを共有できます。

出典:こちら

于 2013-04-25T10:07:22.523 に答える
0

これは、Java では初期化ブロックと呼ばれます。

初期化ブロックは、クラスのオブジェクトが作成される前に実行される中かっこの間のコードのブロックです。初期化ブロックの実行はオブジェクトの作成に依存するため、2 つのタイプのオブジェクトがあることは容易に推測できます。

ほとんどの場合、これは、コンストラクターを使用する場合に毎回初期化したいクラス内の何かを初期化するために使用されます。

例: クラスに 3 つのコンストラクターがあるとします。
最初のものは IO を初期化します。
2つ目はソケットなどの初期
化です。クラスのインスタンス変数を初期化したい場合は、使用しているコンストラクターは関係ありません。したがって、これには2つの解決策があります:

  1. 各コンストラクターに初期化コードを入れます。
  2. 初期化ブロックを使用してそれらの変数を配置すると、コンストラクターが呼び出されるたびにそれらの変数が初期化されます。
于 2013-04-25T10:07:21.750 に答える
0

なじみがないかもしれませんが、それ自体は悪くありません。構築時に実行される初期化ブロックです。静的初期化ブロックも含む詳細な説明については、こちらを参照してください。

于 2013-04-25T10:08:03.203 に答える