令我吃驚的這個代碼工作正常:何時在switch語句中聲明引用?
int i = 2;
switch(i) {
case 1:
String myString = "foo";
break;
case 2:
myString = "poo";
System.out.println(myString);
}
但是字符串引用決不應申報?難道所有情況下的所有變量總是被聲明,不管怎麼樣,或者這是如何解決的?
令我吃驚的這個代碼工作正常:何時在switch語句中聲明引用?
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編譯器附近的權利,但不應該編譯)。
今天我學到了一些新東西! – 2010-06-17 08:04:41
確實沒有編譯。 – musiKk 2010-06-17 08:06:25
@musikk:感謝您的確認,並不是經常我很高興某些東西不能編譯:) – 2010-06-17 08:07:56
myString聲明的範圍是開關塊(其中{字符是))。如果你是這樣寫的,聲明將是每種情況:
int i = 2;
switch(i) {
case 1: {
String myString = "foo";
break;
}
case 2: {
String myString = "poo";
System.out.println(myString);
}
}
並不是所有的聲明都在包含它們的{...}塊的開頭完成嗎? – 2010-06-17 08:00:22
我認爲Jules是對的。 Java具有靜態作用域,因此控制流程不會影響變量的創建(而不是初始化)。進入交換機模塊後,堆棧中的位置將被分配。但它仍然是一種好奇心。 GCC拒絕爲(我認爲)相同的原因編譯等價的C代碼Java拒絕編譯'if(someBool)String s =「foo」;' – musiKk 2010-06-17 08:19:18