Почему Java не имеет ограниченных по объему блоком объявлений переменной?

9
задан skiphoppy 26 September 2008 в 19:23
поделиться

5 ответов

Я полагаю, что объяснение - то, что большую часть времени, который не является намеренным, это - программирование или логический дефект.

в примере, столь же тривиальном как Ваш, ее очевидное, но в большом блоке кода, случайно повторно объявляя переменную не может быть очевидным.

ETA: это могло бы также быть связано с обработкой исключений в Java. я думал, что часть этого вопроса была обсуждена в вопросе, связанном с тем, почему переменные, объявленные в разделе попытки, не были доступны в объемах выгоды/наконец.

13
ответ дан 4 December 2019 в 05:53
поделиться

Поскольку устройствам записи весьма свойственно сделать это намеренно и затем полностью завинтить его путем упущения, что существует теперь две переменные с тем же именем. Они меняют внутреннее имя переменной, но код отпуска, который использует переменную, которая теперь unintentially использует ранее затененную переменную. Это приводит к программе, которая все еще компилирует, но выполняется с ошибками.

Точно так же это весьма характерно для случайно теневых переменных, и измените поведение программы. Невольно затенение, существующая переменная может изменить программу так же легко как незатенение переменная, поскольку я упомянул выше.

Существует так мало преимущества для разрешения этого затенения, что они исключили его как слишком опасное. Серьезно, просто назовите свою новую переменную, что-то еще и проблема уходят.

19
ответ дан 4 December 2019 в 05:53
поделиться

Это приводит к ошибкам, которые трудно определить, я предполагаю. Это подобно в C#.

Паскаль не поддерживает это, так как необходимо объявить переменные выше тела функции.

10
ответ дан 4 December 2019 в 05:53
поделиться

Ну, строго говоря Java действительно имеет ограниченные по объему блоком объявления переменной; таким образом, это - ошибка:

void methodName() {
  for (int j = 0; j < 10; j++) {
    int i = j * 2;
  }
  System.out.println(i); // error
}

Поскольку 'я' не существую вне для блока.

Проблема состоит в том, что Java не позволяет Вам создавать переменную с тем же названием другой переменной, которая была объявлена во внешнем блоке того же метода. Как другие люди сказали, предположительно, это было сделано для предотвращения ошибок, которые трудно определить.

24
ответ дан 4 December 2019 в 05:53
поделиться

Базовое предположение в этом вопросе является неправильным.

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 в методе.

1
ответ дан 4 December 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: