Какова разница между локальными и переменными экземпляра в Java

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

EDIT:

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

Основное отличие - переменные экземпляра получают значения по умолчанию, такие как значение int get zero char получает значение null, но не локальные переменные. Вы можете оставить неинициализированную переменную экземпляра, но там, где локальные переменные должны быть инициализированы, иначе вы получите ошибку компилятора.

Ответ 9

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

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

Ответ 10

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

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

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

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

целые числа 0

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

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

ссылки null

Ответ 11

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