Основы языка Java
Java — статически и строго типизированный объектно-ориентированный язык. Исходный код компилируется не в машинный код, а в переносимый bytecode, который выполняет виртуальная машина (JVM) на любой платформе — «написал однажды, запускай везде». JVM сама управляет памятью через сборку мусора, поэтому сырых указателей здесь нет — только ссылки.
Но Java — не чисто объектный язык: рядом с объектами живут примитивы (int, char, boolean), которые объектами не являются. Именно этот раскол между примитивами и объектами порождает большинство ловушек для новичка — автоупаковку, кэш Integer, разницу == и equals(). Слои ниже разбирают язык от модели выполнения до этих ловушек.
Карта темы
- Ключевые черты Java — компиляция в bytecode, статическая типизация, автоматическое управление памятью.
- Метод main — почему точка входа объявлена как
public static void main(String[] args). - static против instance — член класса против члена объекта; почему
static-метод не видитthis. - Порядок инициализации — static, затем инициализаторы полей, затем конструктор; от родителя к потомку.
- Классы-обёртки — как
IntegerиDoubleдают примитиву объектную форму для коллекций и обобщений. - Автоупаковка — скрытые
valueOfиintValue,NullPointerExceptionпри распаковкеnull. - Кэш Integer — почему
==на обёртках истинно только в диапазоне -128..127. - final, finally, finalize — три похожих по написанию, но не связанных понятия.
- Почему Java не чистое ООП — примитивы не объекты, а обёртки наводят мост.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
| Считать, что Java компилируется в машинный код | Java компилируется в переносимый bytecode, который выполняет JVM |
| Называть Java динамически типизированным | Типы проверяются компилятором до запуска, а не во время выполнения |
Сравнивать обёртки Integer через == | Внутри -128..127 кэш даёт true, вне диапазона — false; нужен equals() |
Распаковать Integer, равный null | Скрытый intValue() бросает NullPointerException, а не даёт 0 |
Ждать, что static-блок выполнится на каждый new | Он выполняется один раз при загрузке класса |
Путать static и final | static — одна общая копия, final — запрет переприсвоения; оси независимы |
Полагаться на finalize() для очистки | Устарел и может не вызваться; нужны try-with-resources / Cleaner |
Значение для собеседований
Основы языка спрашивают почти на каждом junior-интервью — но проверяют не заучивание, а понимание модели: где живут данные и когда что выполняется. Кандидат, который объясняет автоупаковку через «компилятор вставляет Integer.valueOf, а тот кэширует -128..127», сразу выделяется на фоне «ну, int превращается в Integer».
Что обычно проверяют:
- Чем bytecode отличается от машинного кода и что делает Java платформонезависимой.
- Почему
mainобъявленpublic static voidи что такоеString[] args. - Разницу
staticи instance; почемуstatic-метод не имеетthis. - Порядок инициализации: static → инициализаторы полей → конструктор, родитель раньше потомка.
- Примитивы против обёрток, автоупаковку и её цену, кэш
Integerи почему==ненадёжен.
Типичный неверный ответ: «== сравнивает значения обёрток». Это открывает разговор о том, что == сравнивает ссылки, а кэш Integer делает результат то истинным, то ложным для одинаковых чисел — и что значения обёрток нужно сравнивать через equals().