Я изучаю поиск имен в 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 ++, и если бы я был дизайнером, я бы полностью убрал это поведение. Это действительно вызывает ошибки и трудно читать код.
Чтобы вести мирную жизнь на Яве, это поведение полностью устранено. Компилятор покажет вам ошибку, если вы попытаетесь сделать это так, как вы видите это сейчас.