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的正常行为还是我错过了什么?
这不是关于"第一个嵌套作用域"的问题—这是Java允许局部变量隐藏字段,但不允许它隐藏另一个局部变量的问题。大概Java的设计者认为这样的隐藏不利于可读性。
注意,在实例初始化器中使用局部变量的例子不会产生错误——这段代码是有效的:
class C {
int a = 11;
{
// Local variable hiding a field. No problem.
double a = 0.2;
}
}
我不是一个c++爱好者,但从c++的角度来看,这真的很奇怪,如果我是设计师,我会完全删除这种行为。这确实会导致错误和难以阅读的代码。
要在Java过上平静的生活,这种行为被完全消除了。如果你尝试这样做,编译器会显示一个错误,就像你现在看到的那样。
相关文章:
- 你能重载对象变量名本身返回的内容吗
- 在C/C++中将变量名定义为__00000001有什么好处吗
- C++变量名(可以将 main 声明为变量,但对于其他函数名称则不然)
- C++ - 声明中变量名后面的括号
- 如何使替换 c 函数的变量名成为错误?
- 是否可以创建没有变量名的变量
- fstream库,试图创建一个变量名为(c++)的文件
- 一个数组C++中的消息和变量名
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 数组的变量名和该数组的地址有什么区别?
- 如何将变量名设置为字符串?C++
- 类中具有相同变量名的多重继承
- 双向量隐藏变量
- 如何在从.txt文件中读取时不重复相同的变量名
- 在循环中使用相同的变量名可以吗
- C++保留符号作为C变量名
- 在C++中,在给定的相同作用域内声明相同的变量名
- 为什么类名与"::"一起使用在变量名之前?
- 在同级之间继承相同的变量名
- 如何向调试器隐藏变量/函数名