我知道在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範圍?
我知道在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範圍?
Java變量確實有塊範圍,但如果你注意到INT一個在範圍上已經定義
{ int a = 0; { { } } }
所有子範圍是在最上面的大括號的範圍。因此你會得到一個重複的變量錯誤。
他們有塊範圍。這意味着你不能在塊之外使用它們。但是,Java不允許在內部塊中的名稱中隱藏外部塊中的名稱。
它的確如此,但它是嵌套的,所以您在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.
}
}
以前的答案已經提到的原因,但我只是想表明,這仍然是允許的:
void foo(){
for(int i = 0; i < 10; ++i){
int a = 1;
}
int a = 0;
}
在這種情況下,循環內的a
不會隱藏外部a
,所以它是有效的。
另外恕我直言,它應該在C++中也是這樣,它不那麼容易混淆,並防止意外聲明變量具有相同的名稱。
局部變量 聲明的塊中的(§14.2)範圍是 其餘在其中出現的 聲明,以開始其自己的 初始化(§塊的14.4)並且在 聲明中包含 的任何進一步聲明者 中的局部變量聲明 。
局部變量v的名稱可能不 重新聲明作爲 局部變量的直接封閉方法,V的範圍內 構造或初始化塊 或 編譯時間錯誤發生。
你是什麼意思的「不工作」?編譯器錯誤或警告,或...?請儘量準確描述您的描述。 – 2010-10-05 08:53:38
關於此的良好擴展討論可以在這裏找到: http://stackoverflow.com/questions/141140/why-does-java-not-have-block-scoped-variable-declarations – 2010-10-05 08:53:07