Java — объектно-ориентированный язык программирования, который более десяти лет был основным языком Android SDK. Несмотря на официальный переход Google к Kotlin, Java остаётся важной частью экосистемы: легаси-проекты, корпоративные приложения и миллионы строк кода в Google Play продолжают работать на Java. По данным отчёта JetBrains Developer Ecosystem (2025), около 35% Android-проектов всё ещё используют Java. Подробнее об актуальных трендах читайте в официальном отчёте JetBrains.
Главное
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-потоке.
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) транслируются в совместимый код для старых версий.
| Версия Java | Android API (min) | Версия Android | Ключевые фичи |
|---|---|---|---|
| Java 7 | API 19 | 4.4 KitKat | try-with-resources, multi-catch |
| Java 8 | API 24 | 7.0 Nougat | Лямбды, Stream API, Optional |
| Java 11 | API 31 | 12 | HTTP Client, Local-Variable Syntax |
| Java 17 | API 34 | 14 | Records, Sealed Classes (D8) |
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+ код без изменений в исходнике разработчика.
// Простой 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 в Java — последовательность колбэков: onCreate → onStart → onResume (активно), onPause → onStop → onDestroy (завершение). Разработчик переопределяет эти методы для управления ресурсами. onCreate — инициализация, onPause — сохранение данных, onDestroy — освобождение ресурсов. Android вызывает эти методы при повороте экрана, уходе в фоновый режим и получении звонка.
// Жизненный цикл 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 — C-подобный, строго типизированный, объектно-ориентированный. Каждый файл .java содержит один public class, имя которого совпадает с именем файла. Java не поддерживает функции вне классов — всё является методом. Точка входа — статический метод public static void main(String[] args) для консольных приложений или методы жизненного цикла Android Activity для мобильных.
Java делит типы на примитивы (int, double, boolean, char, byte, short, long, float) и ссылочные типы (классы, интерфейсы, массивы, enum). Примитивы хранятся на стеке и передаются по значению. Объекты — в куче, передаются по ссылке. Автоупаковка (autoboxing) автоматически конвертирует примитив в объект-обёртку (Integer, Double, Boolean), но создаёт лишние объекты — в Android это критично для производительности UI.
// Примеры типов данных и структур 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 и 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 автоматически приводят типы после проверки.
| Аспект | Java | Kotlin |
|---|---|---|
| Null safety | @Nullable / @NonNull аннотации | String? / String — встроено |
| Data class | 50+ строк с Lombok | data class User(val name: String) |
| Extension | Статические утилитарные классы | fun String.isEmail(): Boolean |
| Coroutines | AsyncTask / ExecutorService | suspend + 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 включают 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 ускоряет последующие сборки за счёт кэширования.
// 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 в 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 — объектно-ориентированный язык программирования от Sun Microsystems (1995), работающий на виртуальной машине JVM. Являлся основным языком Android SDK до 2019 года. Используется в мобильной разработке для легаси-проектов, серверной части (Spring) и корпоративных приложений. Отличается строгой типизацией, автоматической сборкой мусора и кроссплатформенностью байт-кода.
Google объявил Kotlin приоритетным языком для Android в 2019 году. Новые библиотеки AndroidX, Jetpack Compose, рекомендации по архитектуре и документация по умолчанию даются на Kotlin. Java остаётся полностью поддерживаемым, но API проектируются с Kotlin-first подходом. Java-проекты требуют больше шаблонного кода и не получают новые языковые возможности первыми.
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.
Kotlin требует меньше кода: data class заменяет десятки строк Java-боilerplate, null safety встроен в типы, корутины упрощают асинхронность. Java предлагает более простой синтаксис для начинающих, проверенную экосистему библиотек и стабильный тулинг. Производительность рантайма идентична — оба компилируются в JVM байт-код, выполняемый Android ART.
Android Studio — стандартная IDE для Android-разработки с поддержкой Java и Kotlin. Включает эмулятор, профилировщик (CPU, memory, network), Layout Inspector, APK Analyzer. IntelliJ IDEA подходит для серверной Java. Eclipse ADT устарел и не поддерживается Google. Android Studio также предоставляет инструменты для миграции Java-кода в Kotlin через встроенный конвертер.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также