Java: что это за язык, его особенности и Android разработка

Автор: IT Sectr Опубликовано: 2026-02-10 Время чтения: 11 мин

Java — объектно-ориентированный язык программирования, который более десяти лет был основным языком Android SDK. Несмотря на официальный переход Google к Kotlin, Java остаётся важной частью экосистемы: легаси-проекты, корпоративные приложения и миллионы строк кода в Google Play продолжают работать на Java. По данным отчёта JetBrains Developer Ecosystem (2025), около 35% Android-проектов всё ещё используют Java. Подробнее об актуальных трендах читайте в официальном отчёте JetBrains.

Главное

  • Java — основной язык Android до 2019 года, легаси-код составляет ~35% проектов
  • JVM — виртуальная машина, обеспечивающая кроссплатформенность байт-кода Java
  • Android SDK — полный набор инструментов, включающий компилятор, эмулятор и профилировщик
  • Kotlin — преемник Java, но оба языка компилируются в один байт-код JVM
  • Gradle — система сборки, управляющая зависимостями и конфигурациями в Android-проектах

Что такое Java?

Java — язык программирования общего назначения, созданный компанией Sun Microsystems в 1995 году. Главный принцип — «Write Once, Run Anywhere»: скомпилированный байт-код Java выполняется на любой платформе, где установлена виртуальная машина JVM. В контексте мобильной разработки Java стала первым официальным языком Android SDK, выпущенного Google в 2008 году.

Архитектура Java основана на трёх компонентах: JDK (Java Development Kit) — набор инструментов разработчика, JRE (Java Runtime Environment) — среда выполнения и JVM (Java Virtual Machine) — виртуальная машина. Android использует собственную реализацию JVM — Android Runtime (ART), заменившую Dalvik в версии 5.0 (Lollipop). ART выполняет DEX-байт-код, который компилируется из Java-байт-кода через dx/d8 утилиту.

Ключевая особенность Java — автоматическое управление памятью через Garbage Collector (GC). Разработчику не нужно явно освобождать память — GC отслеживает неиспользуемые объекты и удаляет их. В Android ART используется Concurrent Mark Sweep (CMS) и Generational GC, оптимизированные под ограниченные ресурсы мобильных устройств. Это снижает нагрузку на разработчика, но может вызывать «лаги» при сборке мусора в UI-потоке.

Версии Java и Android API

Android поддерживает подмножество Java API, которое расширяется с каждой новой версией ОС. Android 12 (API 31) добавил поддержку Java 11, включая лямбды с захватом переменных, модульную систему JPMS и HTTP-клиент java.net.http. Android 14 (API 34) ввёл экспериментальную поддержку Java 17 через десахаринг D8/R8 — некоторые фичи (records, sealed classes) транслируются в совместимый код для старых версий.

Версия JavaAndroid API (min)Версия AndroidКлючевые фичи
Java 7API 194.4 KitKattry-with-resources, multi-catch
Java 8API 247.0 NougatЛямбды, Stream API, Optional
Java 11API 3112HTTP Client, Local-Variable Syntax
Java 17API 3414Records, Sealed Classes (D8)

Java SDK и Android разработка

Android SDK включает компилятор Java, утилиту dex (d8), aapt (Asset Packaging Tool), эмулятор и библиотеки android.* и java.*. Разработчик пишет код на Java, компилирует его в .class-файлы (JVM байт-код), затем d8 преобразует их в .dex-файлы (Dalvik Executable), которые упаковываются в APK вместе с ресурсами и AndroidManifest.xml.

Gradle — система сборки Android-проекта. Файл build.gradle (Groovy) или build.gradle.kts (Kotlin DSL) описывает зависимости, SDK-версии, флейворы (product flavors) и подписи. Android Gradle Plugin (AGP) версии 8.x автоматизирует desugar — трансляцию современных Java-фич в обратно-совместимый код. Например, java.time.LocalDate превращается в совместимый с API 21+ код без изменений в исходнике разработчика.

java
// Простой Android Activity на Java
package com.example.myapp;

import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv = findViewById(R.id.textView);
        tv.setText("Hello from Java!");
    }

    // Метод для обработки нажатия кнопки
    public void onButtonClick(View view) {
        TextView tv = findViewById(R.id.textView);
        tv.setText("Button clicked");
    }
}

Класс MainActivity наследует AppCompatActivity — базовый класс из AndroidX для обратной совместимости. Метод onCreate вызывается при создании Activity, в нём устанавливается layout через setContentView. findViewById связывает Java-переменную с элементом из XML-разметки. Метод onButtonClick привязан к кнопке через атрибут android:onClick в XML.

Работа с Activity и жизненный цикл

Жизненный цикл Activity в Java — последовательность колбэков: onCreate → onStart → onResume (активно), onPause → onStop → onDestroy (завершение). Разработчик переопределяет эти методы для управления ресурсами. onCreate — инициализация, onPause — сохранение данных, onDestroy — освобождение ресурсов. Android вызывает эти методы при повороте экрана, уходе в фоновый режим и получении звонка.

java
// Жизненный цикл Activity с управлением состоянием
public class DetailActivity extends AppCompatActivity {
    private String itemId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail);

        itemId = getIntent().getStringExtra("ITEM_ID");
        loadData(itemId);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("item_id", itemId);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        itemId = savedInstanceState.getString("item_id");
        loadData(itemId);
    }

    private void loadData(String id) {
        // Загрузка данных по идентификатору
    }
}

Метод onSaveInstanceState сохраняет состояние Activity при повороте экрана или переключении задач. Bundle содержит пары ключ-значение — простые типы, Parcelable или Serializable объекты. onRestoreInstanceState восстанавливает сохранённое состояние. Этот паттерн критичен для Android, так как система может уничтожить Activity при нехватке памяти и восстановить при возврате пользователя.

Синтаксис Java: классы, методы и типы

Синтаксис Java — C-подобный, строго типизированный, объектно-ориентированный. Каждый файл .java содержит один public class, имя которого совпадает с именем файла. Java не поддерживает функции вне классов — всё является методом. Точка входа — статический метод public static void main(String[] args) для консольных приложений или методы жизненного цикла Android Activity для мобильных.

Типы данных Java

Java делит типы на примитивы (int, double, boolean, char, byte, short, long, float) и ссылочные типы (классы, интерфейсы, массивы, enum). Примитивы хранятся на стеке и передаются по значению. Объекты — в куче, передаются по ссылке. Автоупаковка (autoboxing) автоматически конвертирует примитив в объект-обёртку (Integer, Double, Boolean), но создаёт лишние объекты — в Android это критично для производительности UI.

java
// Примеры типов данных и структур Java
public class DataTypes {
    // Примитивы
    int count = 42;
    double price = 19.99;
    boolean isActive = true;
    char grade = 'A';

    // Ссылочные типы
    String name = "Android";
    Integer boxed = 100; // autoboxing
    List<String> items = new ArrayList<>();

    // Метод с Generics
    public <T> T getFirst(List<T> list) {
        return list.isEmpty() ? null : list.get(0);
    }

    // Enum для фиксированного набора значений
    public enum Status {
        PENDING, LOADING, SUCCESS, ERROR
    }
}

Дженерики List<T> обеспечивают типобезопасность коллекций. Метод getFirst возвращает элемент любого типа — конкретный тип определяется в точке вызова. Enum Status компилируется в класс с фиксированным набором констант, каждый экземпляр — singleton. В Android enum используется реже из-за расхода памяти: ProGuard/R8 оптимизирует enum в int-константы где возможно.

Java vs Kotlin: сравнение в Android

Сравнение Java и Kotlin для Android-разработки — одна из главных тем с 2019 года, когда Google объявил Kotlin приоритетным языком. Kotlin полностью совместим с Java — оба компилируются в байт-код JVM, могут вызывать друг друга и использовать одни библиотеки. Однако подходы к написанию кода кардинально различаются.

Шаблонный код

Kotlin устраняет многословность Java: data class заменяет 50+ строк Java-класса с геттерами, сеттерами, equals, hashCode, toString и copy. Null safety встроен в систему типов Kotlin — NullPointerException практически невозможен. Extension-функции позволяют добавлять методы к существующим классам без наследования. Smart Casts автоматически приводят типы после проверки.

АспектJavaKotlin
Null safety@Nullable / @NonNull аннотацииString? / String — встроено
Data class50+ строк с Lombokdata class User(val name: String)
ExtensionСтатические утилитарные классыfun String.isEmail(): Boolean
CoroutinesAsyncTask / ExecutorServicesuspend + Structured Concurrency
ЛямбдыFunctionalInterface + ::methodЛямбды по умолчанию
Аннотации DI@Inject, @Module, @ProvidesАналогично, но меньше кода

Производительность

По производительности Java и Kotlin идентичны — оба компилируются в байт-код JVM, который Android ART выполняет одинаково. Разница в размере APK: Kotlin добавляет ~200-400 КБ на библиотеку kotlin-stdlib. Java-проекты имеют меньший размер APK за счёт отсутствия дополнительного рантайма, но при использовании Java Stream API и Optional размер APK может вырасти из-за десахаринга.

Инструменты Java разработчика для Android

Инструменты Java-разработчика для Android включают Android Studio, Gradle, профилировщик и эмулятор. Android Studio — официальная IDE, основанная на IntelliJ IDEA Community, включает редактор с автодополнением Java, анализатор кода (lint), рефакторинг и визуальный редактор макетов (Layout Editor).

Основные инструменты

Android Gradle Plugin (AGP) версии 8.x управляет сборкой: компиляция Java в классах, десахаринг, минификация ProGuard/R8, упаковка в APK/AAB. R8 — обновлённый десахаринг и обфускатор, заменяющий ProGuard. Build variants (debug/release + product flavors) настраиваются через build.gradle. Gradle Daemon ускоряет последующие сборки за счёт кэширования.

groovy
// build.gradle (app) — конфигурация Java-модуля
android {
    compileSdk 34
    defaultConfig {
        applicationId "com.example.myapp"
        minSdk 21
        targetSdk 34
        versionCode 1
        versionName "1.0"
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
}

dependencies {
    implementation 'androidx.core:core-ktx:1.12.0'
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.11.0'
    testImplementation 'junit:junit:4.13.2'
}

Блок compileOptions указывает Java-версию для компиляции — Java 17 доступен с AGP 8.x. Минимальная SDK (minSdk) определяет минимальную версию Android, на которой работает приложение. Target SDK — версия, для которой приложение тестировалось. Разница между compileSdk и targetSdk: compileSdk — API для компиляции, targetSdk — поведение рантайма.

Ограничения Java в мобильной разработке

Ограничения Java в Android стали причиной перехода Google на Kotlin. NullPointerException — самое частое исключение в Java-Android-приложениях, так как система типов не различает nullable и non-null ссылки. Google рекомендует аннотации @Nullable и @NonNull из пакета androidx.annotation, но компилятор не проверяет их — это делает только lint.

Отсутствие корутин — ещё одно ограничение: асинхронные операции в Java требуют колбэков, AsyncTask (deprecated с API 30), ExecutorService или RxJava. Это приводит к callback hell и утечкам памяти при повороте экрана. Kotlin coroutines с Structured Concurrency решают эту проблему на уровне языка: корутина отменяется при уничтожении Activity без ручного управления.

Шаблонный код в Java — источник ошибок при ручном написании equals/hashCode, Parcelable реализаций и ViewHolder для RecyclerView. Android KTX библиотеки и Jetpack Compose ориентированы на Kotlin. Новые API Android (Room, Navigation, Compose) публикуют примеры на Kotlin по умолчанию, хотя Java-версии существуют.

Часто задаваемые вопросы

Что такое Java?

Java — объектно-ориентированный язык программирования от Sun Microsystems (1995), работающий на виртуальной машине JVM. Являлся основным языком Android SDK до 2019 года. Используется в мобильной разработке для легаси-проектов, серверной части (Spring) и корпоративных приложений. Отличается строгой типизацией, автоматической сборкой мусора и кроссплатформенностью байт-кода.

Почему Java считается легаси-языком для Android?

Google объявил Kotlin приоритетным языком для Android в 2019 году. Новые библиотеки AndroidX, Jetpack Compose, рекомендации по архитектуре и документация по умолчанию даются на Kotlin. Java остаётся полностью поддерживаемым, но API проектируются с Kotlin-first подходом. Java-проекты требуют больше шаблонного кода и не получают новые языковые возможности первыми.

Какая версия Java используется в Android?

Android поддерживает Java 8 полностью, Java 11 — частично с Android 12+, Java 17 — экспериментально через D8 десахаринг. Android Gradle Plugin (AGP) 8.x транслирует современный байт-код в совместимый для старых API через desugar. Разработчик может писать на Java 11+, используя лямбды, Optional и DateTime API, но records и sealed classes доступны только через D8.

Чем Java отличается от Kotlin?

Kotlin требует меньше кода: data class заменяет десятки строк Java-боilerplate, null safety встроен в типы, корутины упрощают асинхронность. Java предлагает более простой синтаксис для начинающих, проверенную экосистему библиотек и стабильный тулинг. Производительность рантайма идентична — оба компилируются в JVM байт-код, выполняемый Android ART.

Какие IDE используются для Java разработки под Android?

Android Studio — стандартная IDE для Android-разработки с поддержкой Java и Kotlin. Включает эмулятор, профилировщик (CPU, memory, network), Layout Inspector, APK Analyzer. IntelliJ IDEA подходит для серверной Java. Eclipse ADT устарел и не поддерживается Google. Android Studio также предоставляет инструменты для миграции Java-кода в Kotlin через встроенный конвертер.

Итоги

  • Java — объектно-ориентированный язык, бывший основным для Android SDK на протяжении 11 лет
  • Байт-код JVM транслируется в DEX через d8 и выполняется Android Runtime (ART) с GC
  • Android поддерживает Java 8-17 с десахарингом через D8/R8 для обратной совместимости
  • Java Activity — базовый компонент с жизненным циклом onCreate → onStart → onResume → onPause → onStop → onDestroy
  • Gradle — система сборки с поддержкой Java 17, AGP 8.x и build variants
  • Kotlin — преемник Java с тем же байт-кодом, но современным синтаксисом и null safety
  • Java-легаси составляет ~35% Android-проектов, Google продолжает поддержку обоих языков

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также