О языке 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, удалённые модули и внешние библиотеки требуют проверки при обновлении.

Вопросы для собеседования

  1. Java компилируемая или интерпретируемая? Использует оба этапа: javac создаёт байт-код, JVM интерпретирует и JIT-компилирует.
  2. Что значит статическая типизация? Типы выражений проверяются до запуска.
  3. Java передаёт объект по ссылке? Нет, всегда по значению; значением может быть ссылка.
  4. Почему байт-код кроссплатформенный? Его исполняет JVM соответствующей платформы.
  5. Есть ли множественное наследование классов? Нет, но можно реализовать несколько интерфейсов.
  6. Кто освобождает heap? GC, когда объект становится недостижим.