О языке Java
Java — статически и строго типизированный язык общего назначения. Основной стиль объектный, но язык также поддерживает императивные и функциональные приёмы: lambda, method reference и Stream API.
Как выполняется программа
Исходный .java компилируется javac в платформонезависимый байт-код
.class. Реализация JVM под конкретную ОС загружает и проверяет классы,
интерпретирует код и JIT-компилирует горячие участки в машинные инструкции.
Подробнее: Структура JDK и Class loader.
Кроссплатформенность означает: один корректный байт-код может выполняться на разных совместимых JVM. Сама JVM и нативные зависимости платформозависимы.
Система типов
В языке восемь примитивных типов и ссылочные типы. Переменная ссылочного типа
может содержать null; примитив — нет. Generics дают параметризацию ссылочными
типами, а autoboxing связывает примитивы с обёртками. См.
Обобщения generics.
Классы имеют одиночное наследование реализации, но могут реализовать несколько интерфейсов. Значимые объекты удобно выражать records, закрытые иерархии — sealed types.
Управление исполнением
- исключения разделены на checked и unchecked;
- память объектов управляется Garbage collector;
- для ресурсов есть
try-with-resources; - многопоточность опирается на Java Memory Model;
- стандартная библиотека включает коллекции, I/O, сеть, concurrency и другое.
Java передаёт аргументы только по значению. Для объекта копируется значение ссылки: метод может изменить сам объект, но не может переназначить переменную вызывающего кода.
static void rename(StringBuilder text) {
text.append("!"); // объект изменён
text = new StringBuilder("?"); // ссылка вызывающего не изменена
}Компромиссы платформы
Проверка типов, байт-код и управляемая память уменьшают часть системных ошибок. Цена — прогрев JIT, работа GC и дополнительная runtime-среда. Производительность зависит не только от языка, но и от профиля нагрузки, JVM и структуры данных.
Совместимость сильна, но не абсолютна: внутренние JDK API, reflection, удалённые модули и внешние библиотеки требуют проверки при обновлении.
Вопросы для собеседования
- Java компилируемая или интерпретируемая? Использует оба этапа: javac создаёт байт-код, JVM интерпретирует и JIT-компилирует.
- Что значит статическая типизация? Типы выражений проверяются до запуска.
- Java передаёт объект по ссылке? Нет, всегда по значению; значением может быть ссылка.
- Почему байт-код кроссплатформенный? Его исполняет JVM соответствующей платформы.
- Есть ли множественное наследование классов? Нет, но можно реализовать несколько интерфейсов.
- Кто освобождает heap? GC, когда объект становится недостижим.