为什么Java中的switch语句的范围不受限制?

sda*_*das 6 java scope language-design switch-statement

为什么在Java中,变量的范围局限于开关块而不是case块.例如,

// Scope limited to a switch block
switch (number) {
case 1:
    String result = "...";
    break;
case 2:
    result = "...";
    break;
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,结果只需要声明一次.如果您声明两次,则会收到一条Duplicate local variable消息.

我的问题是:程序如何知道你已经声明result,如果number = 2?(它不会落入case 1并且不会声明变量......或者它会吗?)

编辑:

我可能会让所有人感到困惑.我理解如何限制变量的范围,但我的问题是:如果不属于这种情况,Java如何知道结果已被声明

zw3*_*324 6

编辑:Java使用词法作用域(也称为静态作用域),因此变量的范围在编译期间确定,与实际评估无关.

Java是块作用域,因此它的范围将尊重{}上面的示例.

JLS 6.3:

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


Csa*_*zki 5

您可以通过添加如下所示的大括号将范围限制为大小写块:

// Scope limited to a switch block
switch (number) {
case 1:{
    String result = "...";
    break;
}
case 2:{
    String result = "...";
    break;
}
Run Code Online (Sandbox Code Playgroud)