Java 嵌套作用域和变量名隐藏
Java nested scopes and variables' name hiding
我正在学习在 Java 中查找名称,并且来自 C++ 我发现有趣的是,即使 Java 让我嵌套了很多代码块,我也可以隐藏名称仅在第一个嵌套范围内:
// name hiding-shadowing: local variables hide names in class scope
class C {
int a=11;
{
double a=0.2;
//{
// int a; // error: a is already declared in instance initializer
//}
}
void hide(short a) { // local variable a,hides instance variable
byte s;
for (int s=0;;); // error: s in block scope redeclares a
{
long a=100L; // error: a is already declared in (method) local scope
String s; //error: s is alredy defined in (method) local scope
}
}
}
从 C++ 的角度来看这很奇怪,因为我可以嵌套我想要的范围,并且我可以根据需要隐藏变量。这是 Java 的正常行为还是我遗漏了什么?
这与 "first nested scope" 无关 - 这是 Java 允许局部变量隐藏字段但不允许它隐藏 另一个 的问题局部变量。据推测 Java 的设计者认为这种隐藏不利于可读性。
请注意,您在实例初始值设定项中的局部变量示例不会产生错误 - 此代码有效:
class C {
int a = 11;
{
// Local variable hiding a field. No problem.
double a = 0.2;
}
}
我不是 C++ 专家,但从 C++ 方面来看确实很奇怪,如果我是设计师,我会完全消除这种行为。这确实会导致错误并且难以阅读代码。
为了在 Java 中过上平静的生活,这种行为已完全消除。如果您像现在看到的那样尝试这样做,编译器会向您显示错误。
我正在学习在 Java 中查找名称,并且来自 C++ 我发现有趣的是,即使 Java 让我嵌套了很多代码块,我也可以隐藏名称仅在第一个嵌套范围内:
// name hiding-shadowing: local variables hide names in class scope
class C {
int a=11;
{
double a=0.2;
//{
// int a; // error: a is already declared in instance initializer
//}
}
void hide(short a) { // local variable a,hides instance variable
byte s;
for (int s=0;;); // error: s in block scope redeclares a
{
long a=100L; // error: a is already declared in (method) local scope
String s; //error: s is alredy defined in (method) local scope
}
}
}
从 C++ 的角度来看这很奇怪,因为我可以嵌套我想要的范围,并且我可以根据需要隐藏变量。这是 Java 的正常行为还是我遗漏了什么?
这与 "first nested scope" 无关 - 这是 Java 允许局部变量隐藏字段但不允许它隐藏 另一个 的问题局部变量。据推测 Java 的设计者认为这种隐藏不利于可读性。
请注意,您在实例初始值设定项中的局部变量示例不会产生错误 - 此代码有效:
class C {
int a = 11;
{
// Local variable hiding a field. No problem.
double a = 0.2;
}
}
我不是 C++ 专家,但从 C++ 方面来看确实很奇怪,如果我是设计师,我会完全消除这种行为。这确实会导致错误并且难以阅读代码。
为了在 Java 中过上平静的生活,这种行为已完全消除。如果您像现在看到的那样尝试这样做,编译器会向您显示错误。