Где и зачем применяется ключевое слово static в Java
Javaключевое слово staticосновы Javaстатические классыстатические переменные
Что проверяют
Понимаете ли вы, что static привязывает член к классу, а не к экземпляру, и знаете ли подводные камни.
Как отвечать
static означает принадлежность классу: член существует в одном экземпляре и доступен без создания объекта.
Где применяется:
- поля: константы (
static final), счётчики, кэши. Инициализируются при загрузке класса; - методы: утилиты, не зависящие от состояния объекта (
Math.max, фабричные методыof,valueOf). Не могут обращаться к нестатическим членам и не переопределяются: у них статическое связывание, а не полиморфизм; - блок инициализации:
static { ... }выполняется один раз при загрузке класса; - вложенные классы: статический вложенный класс не хранит ссылку на внешний экземпляр, в отличие от внутреннего. Это важно для памяти;
- импорт:
import staticдля констант и утилит.
Подводные камни, ради которых вопрос и задают:
- статическое поле живёт, пока загружен класс, то есть фактически всё время работы приложения. Коллекция в статическом поле это классическая утечка памяти, а в Android ещё и утечка контекста активности;
- общее состояние: статическое изменяемое поле разделяется всеми потоками, значит нужна синхронизация;
- тестируемость: статический вызов нельзя подменить обычным способом, поэтому зависимость через статику мешает писать тесты;
- нестатический внутренний класс держит ссылку на внешний объект, и это тоже частая причина утечек.
Где спотыкаются
Считают статические методы переопределяемыми.
Держат изменяемое состояние в статическом поле без синхронизации.
Не знают разницы между статическим и обычным вложенным классом.
Обращаются к нестатическому полю из статического метода и не понимают ошибку компиляции.