クラス構造(static初期化子・インスタンス初期化子・コンストラクタの実行順序)難易度 高無料
次のコードの出力として正しいものを選べ。
1 public class Q9 {
2 static { System.out.print("S"); }
3 { System.out.print("I"); }
4 public Q9() { System.out.print("C"); }
5 public static void main(String[] args) {
6 new Q9();
7 new Q9();
8 }
9 }
- A
SICIC - B
SSICIC(static初期化子は new のたびに走る) - C
SCICI(コンストラクタがインスタンス初期化子より先に実行される) - D
ICICS(static初期化子は最後にまとめて実行される)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済
解説
クラスには3種類の初期化コードがあり、実行タイミングが異なる。
各誤答が違う理由- static 初期化子(
static { ... }):クラスが最初にロードされた時に1回だけ実行される。 - インスタンス初期化子(
{ ... }):インスタンスが生成されるたびに、コンストラクタ本体の実行より前に実行される。 - コンストラクタ:インスタンス初期化子の後に実行される。
main 実行時、Q9 クラスが初めてロードされ static 初期化子が1回だけ走り "S" を出力。
その後 new Q9() のたびに「インスタンス初期化子→コンストラクタ」の順で "I"→"C" が出力される。
2回の new Q9() でこれが2セット走るので、全体は "S" + "IC" + "IC" → SICIC。
- Bstatic初期化子はクラスロード時に1回だけ実行される。何度
newしても再実行されない。 - C実行順は「インスタンス初期化子→コンストラクタ本体」。コンストラクタが先に走ることはない。
- Dstatic初期化子はクラスが最初にロードされる時点(1回目の
newより前)で実行される。最後にまとめて走るのではない。
ひっかけ: 「static初期化子もインスタンス生成のたびに走る」「インスタンス初期化子はコンストラクタの後に実行される」という2点の誤解が典型的な罠。static はクラスにつき1回のみ、インスタンス初期化子はコンストラクタより先に実行される。
コマンド例と想定される挙動(未実行)
出力: SICIC
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)