Java switch语句中何时声明引用?

Java switch语句中何时声明引用?,java,switch-statement,Java,Switch Statement,令我惊讶的是,这段代码运行良好: int i = 2; switch(i) { case 1: String myString = "foo"; break; case 2: myString = "poo"; System.out.println(myString); } 但是字符串引用永远不应该被声明?是不是每种情况下的所有变量都是声明的,不管是什么,或者是如何解决的?好吧,这是关于括号(即范围) 可以说,更好的做法是这样写你的陈述: int i = 2;

令我惊讶的是,这段代码运行良好:

int i = 2;
switch(i) {
case 1:
    String myString = "foo";
    break;
case 2:
    myString = "poo";
    System.out.println(myString);
}
但是字符串引用永远不应该被声明?是不是每种情况下的所有变量都是声明的,不管是什么,或者是如何解决的?

好吧,这是关于括号(即范围)

可以说,更好的做法是这样写你的陈述:

int i = 2;
switch(i) {
    case 1: {
        String myString = "foo";
        break;
    }
    case 2: {
        myString = "poo";
        System.out.println(myString);
    }
}

(我现在不在Java编译器附近,但它不应该编译)。

myString声明的范围是开关块(其中{字符是)。如果您这样编写,则声明将按每种情况进行:

int i = 2;
switch(i) {
    case 1: {
        String myString = "foo";
        break;
    }

    case 2: {
        String myString = "poo";
        System.out.println(myString);
    }
}

不是所有的声明都在包含它们的{…}块的开头完成吗?我认为Jules是对的。Java有静态作用域,所以控制流不会影响创建(与初始化相反)变量的。堆栈上的位置是在进入开关块时分配的。但这仍然是一件稀奇的事。GCC拒绝编译等效的C代码,原因(我认为)与Java拒绝编译
if(someBool)String s=“foo”的原因相同
@musikk:谢谢你的确认,我并不经常为某些东西没有编译而感到高兴:)这很有趣……你不怎么考虑它,但你可以通过使用大括号进一步任意限制某些变量的范围。。。