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-версії, флейвори та підписи. 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 клас, ім'я якого збігається з ім'ям файлу. 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
КорутиниAsyncTask / 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 (застарілий з 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?

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-шаблонного коду, 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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