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-версії, флейвори та підписи. 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 клас, ім'я якого збігається з ім'ям файлу. 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 |
| Корутини | 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 (застарілий з API 30), ExecutorService або RxJava. Це призводить до callback hell та витоків пам'яті при повороті екрана. Корутини Kotlin з 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-шаблонного коду, 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.