これが私の理解です。JAVA SE 7仕様の第14章からの引用:
14.2. ブロック
ブロックは、一連のステートメント、ローカル クラス宣言、および中かっこ内のローカル変数宣言ステートメントです。
Block:
{ BlockStatementsopt }
........
BlockStatement:
LocalVariableDeclarationStatement
ClassDeclaration
Statement
したがって、ブロックは常に中かっこで囲まれます{ ... }
。
14.4. ローカル変数宣言ステートメント
ローカル変数宣言ステートメントは、1 つ以上のローカル変数名を宣言します。
LocalVariableDeclarationStatement:
LocalVariableDeclaration ;
LocalVariableDeclaration:
VariableModifiersopt Type VariableDeclarators
.......
VariableDeclarator:
VariableDeclaratorId
VariableDeclaratorId = VariableInitializer
.......
すべてのローカル変数宣言ステートメントは、すぐにブロックに含まれます。ローカル変数宣言ステートメントは、ブロック内の他の種類のステートメントと自由に混在させることができます。
では、「すぐに封じ込める」とはどういう意味ですか?
一部のステートメントには、構造の一部として他のステートメントが含まれています。そのような他のステートメントは、ステートメントのサブステートメントです。S が T を含み、T が U を含む、S および U と異なるステートメント T がない場合、ステートメント S はステートメント U をすぐに含むと言います。同様に、いくつかのステートメントは、その構造の一部として式 (§15) を含みます。
あなたの例を見てみましょう:
public class Test{
public void newMethod(){
if(true)int i=0;
}
}
この場合、次のブロックがあります。
{
if(true)int i=0;
}
このブロック内には、次のものがありIf Statement
ます。
if(true)int i=0;
このステートメントには、ローカル変数の宣言が含まれています。
int i=0;
したがって、条件に違反しています。思い出してください:すべてのローカル変数宣言ステートメントは、すぐにブロックに含まれます。ただし、この場合、ローカル変数の宣言は、ブロック自体ではなく、別のブロックに含まれる If ステートメントに含まれています。したがって、このコードはコンパイルされません。
唯一の例外はfor
ループです。
A local variable declaration can also appear in the header of a for statement (§14.14). In this case it is executed in the same manner as if it were part of a local variable declaration statement.
(理解するために何度か読み直す必要があるかもしれません。)