java基礎求真之switch 的case 后面加上大括號和不加大括號的區別。
下面給出三段代碼大家看一下有什么不同以及哪段代碼能夠編譯通過那段代碼編譯不能通過,為什么?(Why?)
代碼片段一:
int value = 10; switch (value) { case 1: int value1 = 5; break; case 2: int value1 = 6; break; }
代碼片段二:
int value = 10; // switch switch (value) { case 1: { int value1 = 5; break; } case 2: int value1 = 8; break; }
代碼片段三:
int value = 10; // switch switch (value) { case 1: { int value1 = 5; break; } case 2: { int value1 = 8; break; } } }
好了,三段代碼都已經給出了,大家看出來那段代碼能夠編譯通過?那段代碼編譯不同斷過了嗎?
猛地一看似乎沒有多大的區別,不就是case后面加上{}和不加上大括號的區別嗎?
好吧,廢話不多說了,我這邊公布答案:片段1:不能通過編譯器的編譯,片段2和片段3可以通過編譯器的編譯。但是為什么呢?這是一個問題。
想要弄明白這個問題,就要先弄明白Java總變量的作用域問題。我們都知道在java(其他語言也是如此例如:C/C++/java/C#等)中同一個作用域中不能有兩個相同的變量名稱,(因為如果兩個變量名相同容易造成混淆,編譯器不知道到底該用那個變量)。
片段1中的兩個value1的作用域都在switch的{}內。根據“同一個作用域中 不能有兩個名稱相同的變量名”的出片段1肯定不能編譯通過 片段2中的兩個value1的作用域分別為:case 1:中的value1的作用域為case1的{}內。 case 2中的value1的作用域為switch的{}內。兩個變量的作用域不同,當然可以定義相同的變量名稱了。 片段3中的兩個value的作用域分別為:case 1中的value1的作用域為case 1的{}內, case 2中的value1的作用域為case 2的{}內,所以兩個作用域互不交叉,因此編譯能夠通過。 注意:switch()的{}外面有一個value變量名,此時你不能在case 的{}中定義變量名稱為value的 變量,因為switch()的{}外的value變量的作用域包含了case{}內的作用域,
所以現在大家知道case中加上{}和不加{}有什么不同了嗎?這里我就不說了,大家自己理解。下面說一下使用場合。
使用場合:為了防止在case塊中定義相同變量名而出現編譯不同過的情況,我們通常會加上{}(目前就知道這種情況,如果以后遇到了再補充)。
所以通常情況下是不必加上{}的。該怎么做就怎么做。
朋友們如果有不同的意見歡迎指正,大家共同進步。
