- ベストアンサー
Javaのブロックについて
Javaの初期化子でstatic初期化子のテストをしていた際、static初期化子の動作はなんとか理解できたのですが、static初期化子のstaticを取った何もないブロック?の動作がいまいち理解できません。 単なるブロックなので無視されるかと思いきや、インスタンス化したときちゃんと初期化されるのです。 しかもstatic初期化子はインスタンス化の前に実行されるのでthisが使えないのは納得いくのですが、このブロックではthisも使えてしまいます。 一応ググってみたのですが私には見つけられませんでした。 この動作について説明していただけるか、もしくは解説してあるサイトなどご存知ではないでしょうか? スタックなどの内部動作まで詳しく書いてあるとなおうれしいのですが。 public class Order { private String name = "佐藤"; public Order() { System.out.println("高橋"); } //このブロックの動作が謎です。 { System.out.println(this.name); //thisが使える。 System.out.println("山田"); } static { //System.out.println(this.name); インスタンス化前なのでエラー System.out.println("鈴木"); } } 実行クラス public class OrderTest { public static void main(String[] args) { Order order = new Order(); } } 実行結果 鈴木 佐藤 山田 高橋 実行環境 jre1.5.0_06
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
インスタンスイニシャライザは、無名内部クラスがコンストラクタを持てないため、その代わりとして導入された、という説が有力です。ちなみに私は、この説のとおりの使い方をときどきします。
その他の回答 (2)
- Pkakedashi
- ベストアンサー率68% (11/16)
これは、インスタンスイニシャライザとかインスタンス初期化子といわれるもので、コンストラクタの直前に呼ばれます。 (厳密には親のコンストラクタの呼びだし後、自分のコンストラクタの直前です。) リンク先にもありますが、基本的には使わない代物(一般的ではない)です。
- MASA_H
- ベストアンサー率42% (64/151)
staticじゃない初期化子ということでは? static初期化子はインスタンスがいくら作られようと最初のインスタンス生成時のみしか実行されませんが、該当部分は各インスタンス生成時に実行されるということでしょう。
お礼
ありがとうございます。 なるほど、たんなる初期化子と考えると簡単に理解できました。 しかし、このブロックはJavaをやっている人には常識なのでしょうか。 あまり使っているところを見たことがありませんでした。
補足
ありがとうございました。 なるほど、無名内部クラスの初期化などに利用できるのですね。 それにしても内部でどういう動きをしているのか頭が混乱してしまいます。