2010-10-05 49 views
3

我知道在C++變量已經區塊範圍,例如,下面的代碼在C++塊中java變量的作用域是什麼?

void foo(){ 
    int a = 0; 
    for(int i = 0; i < 10; ++i){ 
     int a = 1; //re-define a here. 
    } 

}

但在Java這個片段中不起作用,它會報告「副本局部變量」,確實它意味着Java變量不具有BLOCK範圍?

+1

你是什麼意思的「不工作」?編譯器錯誤或警告,或...?請儘量準確描述您的描述。 – 2010-10-05 08:53:38

+0

關於此的良好擴展討論可以在這裏找到: http://stackoverflow.com/questions/141140/why-does-java-not-have-block-scoped-variable-declarations – 2010-10-05 08:53:07

回答

3

Java變量確實有塊範圍,但如果你注意到INT一個在範圍上已經定義

 { 
    int a = 0; 
     { 
     { 
     } 
     } 




    }

所有子範圍是在最上面的大括號的範圍。因此你會得到一個重複的變量錯誤。

8

他們有塊範圍。這意味着你不能在塊之外使用它們。但是,Java不允許在內部塊中的名稱中隱藏外部塊中的名稱。

1

它的確如此,但它是嵌套的,所以您在foo()中定義的「a」在foo中的所有塊中都可用。

這裏是你要找的東西的例子:

void foo(){ 
    { 
     int a = 0; 
     // Do something with a 
    } 
    for(int i = 0; i < 10; ++i){ 
     int a = 1; //define a here. 
    } 
} 
2

以前的答案已經提到的原因,但我只是想表明,這仍然是允許的:

void foo(){ 
    for(int i = 0; i < 10; ++i){ 
     int a = 1; 
    } 
    int a = 0; 
} 

在這種情況下,循環內的a不會隱藏外部a,所以它是有效的。

另外恕我直言,它應該在C++中也是這樣,它不那麼容易混淆,並防止意外聲明變量具有相同的名稱。

4

Section §14.4.2說:

局部變量 聲明的塊中的(§14.2)範圍是 其餘在其中出現的 聲明,以開始其自己的 初始化(§塊的14.4)並且在 聲明中包含 的任何進一步聲明者 中的局部變量聲明 。

局部變量v的名稱可能 重新聲明作爲 局部變量的直接封閉方法,V的範圍內 構造或初始化塊 或 編譯時間錯誤發生。