Короткий ответ: Потому что это способ языка Java определяется в JLS §6.4.
Возможно использование на других языках так называемого variable shadowing. Однако изобретатели языков Java считали, что это была неудобная функция, которую они не хотели на своем языке:
Это ограничение помогает обнаружить некоторые непонятные ошибки.
Однако найти затенения в другом месте в Java, как утверждают авторы, в том же разделе JLS:
Подобное ограничение на затенение членов местных переменных было судить непрактично, так как дополнение члена в суперклассе может привести к тому, что подклассы должны будут переименовать локальные переменные. Связанные соображения делают ограничения на затенение локальных переменных на членами вложенных классов или на затенение локальных переменных локальными переменными, объявленными внутри вложенных классов, также непривлекательными.
Это означает, что на практике, что следующий код является законным:
class A {
int x = 0;
void m() {
int x = 10; // Shadows this.x
}
}
Как описывают авторы, разрешаются теневым переменным экземпляр, объявляя локальный переменный метод с тем же именем, так как из возможность кого-то расширение функциональности A
в один прекрасный день, когда вы не могли больше компилировать класс B
если затенение было незаконным:
class B extends A {
void m() {
int x = 10; // Shadows A.this.x if A declares x
}
}
Если рассматривать язык как C, где затенение разрешено, вы можете найти неловкое такой код:
int x;
int main()
{
{
int x = 0;
{
extern int x;
x = 1;
}
printf("%d\n", x); // prints 0
}
printf("%d\n", x); // prints 1
return 0;
}
Эта программа не так легко следовать, и, возможно, поэтому не дают ожидаемый результат, благодаря переменной затенение.
Осторожнее с утверждением 'Java не позволяет вам иметь две переменные с одинаковыми именами в рамках одной another.' Это справедливо только для [локальных переменных, методов, конструкторов и параметров исключения] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.3) –
@SotiriosDelimanolis Как эта ссылка вы цитируете, поддерживая ваше заявление? – flow2k
@ flow2k Это не так. Он просто определяет локальные переменные и параметры. Область определяется [здесь] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-6.html#jls-6.3). –