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:谢谢你的确认,我并不经常为某些东西没有编译而感到高兴:)这很有趣……你不怎么考虑它,但你可以通过使用大括号进一步任意限制某些变量的范围。。。