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 или я что-то упустил?
2 ответа
Речь идет не о "первой вложенной области видимости", а о том, что Java позволяет локальной переменной скрыть поле, но не позволяет скрыть другую локальную переменную. Предположительно дизайнеры Java считали такое сокрытие плохим для читабельности.
Обратите внимание, что ваш пример локальной переменной в инициализаторе экземпляра не создает ошибку - этот код действителен:
class C {
int a = 11;
{
// Local variable hiding a field. No problem.
double a = 0.2;
}
}
Я не парень C++, но это действительно странно со стороны C++, и если бы я был дизайнером, я бы полностью убрал это поведение. Это действительно вызывает ошибки и трудно читать код.
Чтобы вести мирную жизнь на Яве, это поведение полностью устранено. Компилятор покажет вам ошибку, если вы попытаетесь сделать это так, как вы видите это сейчас.