Локальные переменные должны быть инициализированы перед использованием, где, как и для переменных экземпляра, таких ограничений нет, почему? - PullRequest
2 голосов
/ 29 ноября 2011

Я понимаю, что локальные переменные размещаются в стеке, а переменные-члены или переменные экземпляра размещаются в куче.Но мне любопытно, почему JVM не может присвоить значение по умолчанию локальной переменной в стеке, если ей не назначено какое-либо значение (при вызове этого метода)?Это как-то связано с тем, как работает компилятор / JVM / Processor?

Ответы [ 5 ]

6 голосов
/ 29 ноября 2011

Может. Однако одна из самых частых ошибок - непреднамеренно неинициализированные локальные переменные. Сделав их незаконными по определению, вы сможете обнаружить такие ошибки при статическом анализе.

С JLS 3, в разделе «4.12.5 Начальные значения переменных» :

Локальной переменной (§14.4, §14.14) должно быть явно задано значение перед его использованием, либо инициализацией (§14.4), либо присвоением (§15.26) способом, который может быть проверен компилятором с помощью правила для определенного назначения (§16).

1 голос
/ 29 ноября 2011

Локальные переменные хранятся в стеке и фактически не создаются до тех пор, пока не будут инициализированы. Если локальная переменная не используется, она не попадает в стек. Поэтому, если вы хотите использовать любую локальную переменную, вы должны ее инициализировать.

Однако переменные экземпляра размещаются в куче и поэтому имеют заполнитель по умолчанию.

Все переменные экземпляра имеют некоторое значение по умолчанию, если они не инициализированы вручную.

0 голосов
/ 29 ноября 2011

Есть несколько причин для этого.Пара:

Во-первых, как уже отмечалось, неинициализированные переменные являются основным источником ошибок, и, хотя нецелесообразно проверять неинициализированные переменные экземпляра, компилятору довольно легко проверять и «диагностировать» неинициализированныелокальные переменные - на самом деле они выпадают без особых дополнительных усилий при анализе потока данных.

Во-вторых, инициализация локальных переменных требует времени.Переменные экземпляра могут быть «инициализированы» простым обнулением экземпляра, и это должно происходить только один раз для экземпляра (и в любом случае это должно быть сделано для «безопасности» и для целей GC), но локальные переменные выделяются здесь и там - некоторыев стеке, некоторые в регистрах, и очистка их занимает реальные циклы каждый раз, когда метод вызывается.

0 голосов
/ 29 ноября 2011

Это не проблема стека / кучи. Дизайн Java имеет несколько хороших и простых элементов стиля программирования. Вы хотите, чтобы объект был инициализирован без каких-либо сомнений. Однако для локальных переменных компилятор может легко выдать предупреждение, если его можно использовать перед инициализацией. Кроме того, требуется объявление стиля + инициализация:

int n = takeN();

Инициализация потребует обнуления кадра стека, что является ненужными издержками.

0 голосов
/ 29 ноября 2011

Зачем вам такое поведение?Если вы объявляете переменную для локального использования, не хотите ли вы инициализировать ее как можно скорее до требуемого начального значения?Переменные экземпляра инициализируются значением по умолчанию при инициализации экземпляра, поскольку их время жизни превышает область объявления и инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...