这段代码无法编译:
synchronized( obj ) {
Object a = new Object()
}
System.out.println( a.toString() );
但我不知道为什么..我的理解是同步块总是最终被执行,所以我希望在synchronized块之后的代码能够知道任何新的声明变量。我哪里错了?
答案 0 :(得分:5)
这不是同步,而是{}
符号。他们定义了一个范围,无论是if
,for
,synchronized
,还是在它们的开头都没有。因此,一旦块完成,a
就会超出范围,因为它是在其中声明的。 (同样在Object a
声明结尾处有一个缺少的分号,但我怀疑你只是忘了复制它。)
答案 1 :(得分:1)
变量范围不是由执行的内容决定的。变量只在它们声明的块内可见。你可能想要做这样的事情:
Object a;
synchronized( obj ) {
a = new Object()
}
System.out.println( a.toString() );
答案 2 :(得分:0)
块内定义的变量不在块外部。
来自Java Language Specification:
块(第14.2节)中局部变量声明的范围是声明出现的块的其余部分,从其自己的初始化器(第14.4节)开始,并包括局部变量右侧的任何其他声明器声明声明。