В чем разница между локальными и переменными экземпляра в Java - PullRequest
14 голосов
/ 18 января 2010

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

Ответы [ 11 ]

37 голосов
/ 18 января 2010

Основные различия, которые я вижу, заключаются в их:

Область действия: Локальные переменные видны только в объявленном методе или блоке, тогда как переменные экземпляра могут просматриваться всеми методами в классе.

Место, где они объявлены: Локальные переменные объявляются внутри метода или блока, тогда как переменные экземпляра внутри класса, но вне метода.

Время существования: Локальные переменные создаются при вызове метода и уничтожаются при выходе из метода, тогда как переменные экземпляра создаются с использованием new и уничтожаются сборщиком мусора, когда на них нет ссылок.

Доступ: Вы не можете получить доступ к локальным переменным, тогда как переменные экземпляра могут быть доступны, если они объявлены как публичные.

Где они объявлены: Локальные переменные объявляются в методе или блоке до их вызова, тогда как переменные экземпляра могут быть объявлены в любом месте уровня класса (даже после их использования).

EDIT:

И я забыл упомянуть, что переменные экземпляра всегда имеют значение, даже если оно не назначено кодом (тогда они будут иметь, например, null, 0, 0.0, false). Для локальных переменных в коде должно быть присвоено значение, иначе компилятор выдаст ошибку.

28 голосов
/ 18 января 2010

Еще одна вещь, о которой я могу подумать:

Переменные экземпляра имеют заданные значения по умолчанию, то есть ноль, если это ссылка на объект, 0, если это целое число.

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

9 голосов
/ 18 января 2010

Еще одно отличие: вам не нужно беспокоиться о параллельном доступе к локальным переменным; тогда как вы делаете с переменными экземпляра в многопоточной среде.

8 голосов
/ 18 января 2010

Нет, вы в значительной степени покрыли это. Переменная экземпляра принадлежит экземпляру класса, локальная переменная принадлежит фрейму стека.

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

5 голосов
/ 15 ноября 2014

Локальная переменная:

  • объявляется внутри метода / конструктора или внутри блока (заключенного в фигурные скобки)
  • должен быть инициализирован перед использованием, иначе он не скомпилируется.

Переменная экземпляра:

  • объявлен внутри класса.
  • инициализация не является обязательной: если она не указана, она содержит значение по умолчанию (0, 0,0, false, null и т.
1 голос
/ 17 июля 2016

Помимо всех вышеупомянутых различий, я хотел бы отметить еще одно отличие: переменные экземпляра могут иметь модификаторы доступа (например, private, public, protected и т. Д.), Но local переменные не будут иметь модификаторов доступа.

1 голос
/ 18 января 2010

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

0 голосов
/ 16 апреля 2019

Локальные переменные находятся в стеке, но переменные-члены (переменные экземпляра) находятся в куче.

0 голосов
/ 08 августа 2016

Локальные переменные объявляются в методе.

Переменные экземпляра объявляются внутри класса, но не внутри метода.

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

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

целые числа 0

с плавающей точкой 0

логическое значение false

ссылка на ноль

0 голосов
/ 10 сентября 2014

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

Переменные экземпляра - это переменные внутри класса, но вне любого метода. Эти переменные создаются при загрузке класса.

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