switch case语句中的java范围声明如何?

以下Java代码在Java 1.7中无错误地执行

public static void main(String[] args) { int x = 5; switch(x) { case 4: int y = 3423432; break; case 5: { y = 33; } } } 

java如何确定y是一个int,因为声明永远不会运行。 在case语句中没有使用大括号时,case语句中的变量声明是否限定为switch语句级别?

声明不是“运行” – 它们不是需要执行的东西,它们只是告诉编译器变量的类型。 (初始化程序会运行,但这很好 – 在为其赋值之前,你不是要尝试读取变量。)

在switch语句中确定范围绝对是奇怪的,但基本上在第一种case声明的变量在第二种case仍然在范围内。

从JLS第6.3节开始 :

块(第14.4节)中局部变量声明的范围是声明出现的块的其余部分,从其自己的初始化程序开始,并在本地变量声明语句中包含右侧的任何其他声明符。

除非您创建额外的块,否则整个switch语句是一个块。 如果您想为每个案例设置一个新范围,您可以使用大括号:

 case 1: { int y = 7; ... } case 2: { int y = 5; ... } 

案件本身并未声明范围。 范围受{}限制。 因此,您的变量y在外部范围(整个开关)中定义,并在内部范围( case 5 )中更新。

据我所知,完整的switch语句是一个范围。 没有rest; 或返回; 声明其他开关案例也将被解释。 因此,当您在switch语句中定义变量时,它在孔开关盒中可见。