Я полагаю, что объяснение - то, что большую часть времени, который не является намеренным, это - программирование или логический дефект.
в примере, столь же тривиальном как Ваш, ее очевидное, но в большом блоке кода, случайно повторно объявляя переменную не может быть очевидным.
ETA: это могло бы также быть связано с обработкой исключений в Java. я думал, что часть этого вопроса была обсуждена в вопросе, связанном с тем, почему переменные, объявленные в разделе попытки, не были доступны в объемах выгоды/наконец.
Поскольку устройствам записи весьма свойственно сделать это намеренно и затем полностью завинтить его путем упущения, что существует теперь две переменные с тем же именем. Они меняют внутреннее имя переменной, но код отпуска, который использует переменную, которая теперь unintentially использует ранее затененную переменную. Это приводит к программе, которая все еще компилирует, но выполняется с ошибками.
Точно так же это весьма характерно для случайно теневых переменных, и измените поведение программы. Невольно затенение, существующая переменная может изменить программу так же легко как незатенение переменная, поскольку я упомянул выше.
Существует так мало преимущества для разрешения этого затенения, что они исключили его как слишком опасное. Серьезно, просто назовите свою новую переменную, что-то еще и проблема уходят.
Это приводит к ошибкам, которые трудно определить, я предполагаю. Это подобно в C#.
Паскаль не поддерживает это, так как необходимо объявить переменные выше тела функции.
Ну, строго говоря Java действительно имеет ограниченные по объему блоком объявления переменной; таким образом, это - ошибка:
void methodName() {
for (int j = 0; j < 10; j++) {
int i = j * 2;
}
System.out.println(i); // error
}
Поскольку 'я' не существую вне для блока.
Проблема состоит в том, что Java не позволяет Вам создавать переменную с тем же названием другой переменной, которая была объявлена во внешнем блоке того же метода. Как другие люди сказали, предположительно, это было сделано для предотвращения ошибок, которые трудно определить.
Базовое предположение в этом вопросе является неправильным.
Java действительно имеет объем блочного уровня. Но это также имеет иерархию объема, который является, почему можно сослаться i
в for
цикл, но нет j
за пределами для цикла.
public void methodName() {
int i = 7;
for (int j = 0; j < 10; j++) {
i = j * 2;
}
//this would cause a compilation error!
j++;
}
Я не могу ни за что в жизни выяснить, почему Вы хотели бы определить объем для поведения любого другого пути. Было бы невозможно определить который i
Вы обращались к внутренней части для цикла, и я держал пари, что возможности составляют 99,999% времени, которое Вы хотите отослать к i
в методе.