2010-06-17 53 views
7

令我吃驚的這個代碼工作正常:何時在switch語句中聲明引用?

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

但是字符串引用決不應申報?難道所有情況下的所有變量總是被聲明,不管怎麼樣,或者這是如何解決的?

+1

並不是所有的聲明都在包含它們的{...}塊的開頭完成嗎? – 2010-06-17 08:00:22

+0

我認爲Jules是對的。 Java具有靜態作用域,因此控制流程不會影響變量的創建(而不是初始化)。進入交換機模塊後,堆棧中的位置將被分配。但它仍然是一種好奇心。 GCC拒絕爲(我認爲)相同的原因編譯等價的C代碼Java拒絕編譯'if(someBool)String s =「foo」;' – musiKk 2010-06-17 08:19:18

回答

7

嗯,它是關於括號(即範圍)。

這是更好的做法,可以說,寫你的語句,像這樣:

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

(我不是一個Java編譯器附近的權利,但不應該編譯)。

+0

今天我學到了一些新東西! – 2010-06-17 08:04:41

+2

確實沒有編譯。 – musiKk 2010-06-17 08:06:25

+0

@musikk:感謝您的確認,並不是經常我很高興某些東西不能編譯:) – 2010-06-17 08:07:56

3

myString聲明的範圍是開關塊(其中{字符是))。如果你是這樣寫的,聲明將是每種情況:

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

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