Локальные переменные — объявляются и существуют только в теле метода или блока, не инициализируются автоматически. Использование неинициализированной локальной переменной приводит к ошибке компиляции.
Переменные экземпляра (поля, не static) — принадлежат каждому объекту отдельно, инициализируются при создании экземпляра объекта.
Статические переменные (static fields) — общие для всех экземпляров класса, существуют в единственном экземпляре на весь класс. Их изменение в одном объекте видно во всех других объектах этого класса.
public class Example { private int instanceVar; // переменная экземпляра private static int staticVar; // статическая переменная public void foo() { int localVar = 0; // локальная переменная } }
Могут ли статические переменные быть приватными и как они видны между разными экземплярами класса?
Ответ: Да, статические переменные могут быть приватными. Их изменение отражается для всех экземпляров класса, т.к. они принадлежат классу, а не объекту.
public class MyClass { private static int counter = 0; public MyClass() { counter++; } public static int getCounter() { return counter; } }
Создание нескольких экземпляров MyClass увеличит один и тот же счетчик.
История
В enterprise-приложении разработчик ошибочно поместил состояние пользователя в static поле. Это привело к тому, что пользователи "видели" данные друг друга в многопользовательской среде.
История
При написании многопоточного приложения переменная экземпляра использовалась внутри static метода без должной синхронизации. Это породило гонки данных и неожиданные результаты.
История
Разработчик решил использовать локальную переменную вместо поля класса для хранения промежуточного результата. Переменная уничтожалась после выхода из метода, и программа всегда возвращала null, что не обнаружили сразу в тестировании.