このコードはコンパイルされません:
synchronized( obj ) {
Object a = new Object()
}
System.out.println( a.toString() );
それでも、理由はわかりません.同期ブロックは常に最終的に実行されるというのが私の理解だったので、同期ブロックに続くコードは、新しく宣言された変数を認識していると思います。どこが間違っていますか?
このコードはコンパイルされません:
synchronized( obj ) {
Object a = new Object()
}
System.out.println( a.toString() );
それでも、理由はわかりません.同期ブロックは常に最終的に実行されるというのが私の理解だったので、同期ブロックに続くコードは、新しく宣言された変数を認識していると思います。どこが間違っていますか?
それは同期ではなく、{}
シンボルです。if
、for
、synchronized
、またはそれらの先頭に何もないかどうかに関係なく、スコープを定義します。そのa
ため、ブロック内で宣言されているため、ブロックが終了するとスコープ外になります。(また、宣言の最後にセミコロンがありObject a
ませんが、それをコピーするのを忘れただけだと思います。)
変数のスコープは、何が実行されるかによって決まりません。変数は、宣言されているブロック内でのみ表示されます。おそらく、次のようなことをしたいと思うでしょう:
Object a;
synchronized( obj ) {
a = new Object()
}
System.out.println( a.toString() );
ブロック内で定義された変数は、ブロックの外には存在しません。
Java言語仕様から:
ブロック内のローカル変数宣言のスコープ (§14.2) は、宣言が表示されるブロックの残りの部分であり、独自の初期化子 (§14.4) から始まり、ローカル変数宣言ステートメントの右側にさらに宣言子があればそれを含みます。