Java: co to za język, jego cechy i tworzenie aplikacji na Androida

Autor: IT Sectr Opublikowano: 2026-02-10 Czas czytania: 11 min

Java — obiektowy język programowania, który przez ponad dziesięć lat był głównym językiem Android SDK. Mimo oficjalnego przejścia Google na Kotlin, Java pozostaje ważną częścią ekosystemu: projekty legacy, aplikacje korporacyjne i miliony linii kodu w Google Play nadal działają w Javie. Według raportu JetBrains Developer Ecosystem (2025), około 35% projektów Android wciąż używa Javy. Więcej o aktualnych trendach przeczytasz w oficjalnym raporcie JetBrains.

Najważniejsze

  • Java — główny język Android do 2019 roku, kod legacy stanowi ~35% projektów
  • JVM — maszyna wirtualna zapewniająca wieloplatformowość kodu bajtowego Javy
  • Android SDK — pełny zestaw narzędzi, obejmujący kompilator, emulator i profiler
  • Kotlin — następca Javy, ale oba języki kompilują się do tego samego kodu bajtowego JVM
  • Gradle — system budowania zarządzający zależnościami i konfiguracjami w projektach Android

Czym jest Java?

Java — język programowania ogólnego przeznaczenia, stworzony przez firmę Sun Microsystems w 1995 roku. Główna zasada — «Write Once, Run Anywhere»: skompilowany kod bajtowy Javy działa na każdej platformie, na której zainstalowana jest maszyna wirtualna JVM. W kontekście tworzenia aplikacji mobilnych Java stała się pierwszym oficjalnym językiem Android SDK, wydanym przez Google w 2008 roku.

Architektura Javy opiera się na trzech komponentach: JDK (Java Development Kit) — zestaw narzędzi programisty, JRE (Java Runtime Environment) — środowisko uruchomieniowe i JVM (Java Virtual Machine) — maszyna wirtualna. Android używa własnej implementacji JVM — Android Runtime (ART), która zastąpiła Dalvik w wersji 5.0 (Lollipop). ART wykonuje kod bajtowy DEX, który jest kompilowany z kodu bajtowego Javy przez narzędzie dx/d8.

Kluczowa cecha Javy — automatyczne zarządzanie pamięcią przez Garbage Collector (GC). Programista nie musi jawnie zwalniać pamięci — GC śledzi nieużywane obiekty i usuwa je. W Android ART używany jest Concurrent Mark Sweep (CMS) i Generational GC, zoptymalizowane pod ograniczone zasoby urządzeń mobilnych. Zmniejsza to obciążenie programisty, ale może powodować «lagi» podczas zbierania śmieci w wątku UI.

Wersje Javy i Android API

Android obsługuje podzbiór Java API, który rozszerza się z każdą nową wersją systemu. Android 12 (API 31) dodał obsługę Javy 11, w tym lambdy z przechwytywaniem zmiennych, modułowy system JPMS i klient HTTP java.net.http. Android 14 (API 34) wprowadził eksperymentalną obsługę Javy 17 przez desugaring D8/R8 — niektóre funkcje (records, sealed classes) są translowane na zgodny kod dla starszych wersji.

Wersja JavyAndroid API (min)Wersja AndroidaKluczowe funkcje
Java 7API 194.4 KitKattry-with-resources, multi-catch
Java 8API 247.0 NougatLambdy, Stream API, Optional
Java 11API 3112HTTP Client, Local-Variable Syntax
Java 17API 3414Records, Sealed Classes (D8)

Java SDK i tworzenie aplikacji na Androida

Android SDK zawiera kompilator Javy, narzędzie dex (d8), aapt (Asset Packaging Tool), emulator oraz biblioteki android.* i java.*. Programista pisze kod w Javie, kompiluje go do plików .class (kod bajtowy JVM), następnie d8 przekształca je w pliki .dex (Dalvik Executable), które są pakowane do APK wraz z zasobami i AndroidManifest.xml.

Gradle — system budowania projektu Android. Plik build.gradle (Groovy) lub build.gradle.kts (Kotlin DSL) opisuje zależności, wersje SDK, flavor (product flavors) i podpisy. Android Gradle Plugin (AGP) w wersji 8.x automatyzuje desugar — translację nowoczesnych funkcji Javy na kod wstecznie zgodny. Na przykład java.time.LocalDate przekształca się w kod zgodny z API 21+ bez zmian w kodzie źródłowym programisty.

java
// Prosty Android Activity w Javie
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("Witaj z Javy!");
    }

    // Metoda obsługi kliknięcia przycisku
    public void onButtonClick(View view) {
        TextView tv = findViewById(R.id.textView);
        tv.setText("Przycisk kliknięty");
    }
}

Klasa MainActivity dziedziczy po AppCompatActivity — klasie bazowej z AndroidX zapewniającej wsteczną zgodność. Metoda onCreate jest wywoływana podczas tworzenia Activity, w niej ustawiany jest layout przez setContentView. findViewById łączy zmienną Javy z elementem z układu XML. Metoda onButtonClick jest przypisana do przycisku przez atrybut android:onClick w XML.

Praca z Activity i cykl życia

Cykl życia Activity w Javie — sekwencja callbacków: onCreate → onStart → onResume (aktywne), onPause → onStop → onDestroy (zakończenie). Programista nadpisuje te metody do zarządzania zasobami. onCreate — inicjalizacja, onPause — zapisywanie danych, onDestroy — zwalnianie zasobów. Android wywołuje te metody przy obrocie ekranu, przejściu w tło i odebraniu połączenia.

java
// Cykl życia Activity z zarządzaniem stanem
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) {
        // Wczytywanie danych po identyfikatorze
    }
}

Metoda onSaveInstanceState zapisuje stan Activity przy obrocie ekranu lub przełączaniu zadań. Bundle zawiera pary klucz-wartość — proste typy, obiekty Parcelable lub Serializable. onRestoreInstanceState przywraca zapisany stan. Ten wzorzec jest krytyczny dla Androida, ponieważ system może zniszczyć Activity przy braku pamięci i przywrócić po powrocie użytkownika.

Składnia Javy: klasy, metody i typy

Składnia Javy — podobna do C, ściśle typowana, obiektowa. Każdy plik .java zawiera jedną publiczną klasę, której nazwa jest zgodna z nazwą pliku. Java nie obsługuje funkcji poza klasami — wszystko jest metodą. Punkt wejścia — metoda statyczna public static void main(String[] args) dla aplikacji konsolowych lub metody cyklu życia Android Activity dla mobilnych.

Typy danych w Javie

Java dzieli typy na prymitywy (int, double, boolean, char, byte, short, long, float) i typy referencyjne (klasy, interfejsy, tablice, enum). Prymitywy są przechowywane na stosie i przekazywane przez wartość. Obiekty — na stercie, przekazywane przez referencję. Autoboxing automatycznie konwertuje prymityw na obiekt opakowujący (Integer, Double, Boolean), ale tworzy dodatkowe obiekty — w Android jest to krytyczne dla wydajności UI.

java
// Przykłady typów danych i struktur w Javie
public class DataTypes {
    // Prymitywy
    int count = 42;
    double price = 19.99;
    boolean isActive = true;
    char grade = 'A';

    // Typy referencyjne
    String name = "Android";
    Integer boxed = 100; // autoboxing
    List<String> items = new ArrayList<>();

    // Metoda z Generics
    public <T> T getFirst(List<T> list) {
        return list.isEmpty() ? null : list.get(0);
    }

    // Enum dla stałego zestawu wartości
    public enum Status {
        PENDING, LOADING, SUCCESS, ERROR
    }
}

Generyki List<T> zapewniają bezpieczeństwo typów kolekcji. Metoda getFirst zwraca element dowolnego typu — konkretny typ jest określany w punkcie wywołania. Enum Status kompiluje się do klasy ze stałym zestawem stałych, każda instancja jest singletonem. W Android enum jest używany rzadziej ze względu na zużycie pamięci: ProGuard/R8 optymalizuje enum do stałych int gdzie to możliwe.

Java vs Kotlin: porównanie w Android

Porównanie Javy i Kotlina dla tworzenia aplikacji na Androida — jeden z głównych tematów od 2019 roku, kiedy Google ogłosił Kotlin priorytetowym językiem. Kotlin jest w pełni zgodny z Javą — oba kompilują się do kodu bajtowego JVM, mogą wywoływać się nawzajem i używać tych samych bibliotek. Jednak podejścia do pisania kodu różnią się zasadniczo.

Kod szablonowy

Kotlin eliminuje rozwlekłość Javy: data class zastępuje 50+ linii klasy Java z getterami, setterami, equals, hashCode, toString i copy. Null safety jest wbudowany w system typów Kotlina — NullPointerException jest praktycznie niemożliwy. Funkcje rozszerzeń (Extension functions) pozwalają dodawać metody do istniejących klas bez dziedziczenia. Smart Casts automatycznie rzutują typy po sprawdzeniu.

AspektJavaKotlin
Null safety@Nullable / @NonNull adnotacjeString? / String — wbudowane
Data class50+ linii z Lombokdata class User(val name: String)
ExtensionStatyczne klasy narzędziowefun String.isEmail(): Boolean
CoroutinesAsyncTask / ExecutorServicesuspend + Structured Concurrency
LambdyFunctionalInterface + ::methodLambdy domyślnie
Adnotacje DI@Inject, @Module, @ProvidesAnalogicznie, ale mniej kodu

Wydajność

Pod względem wydajności Java i Kotlin są identyczne — oba kompilują się do kodu bajtowego JVM, który Android ART wykonuje tak samo. Różnica w rozmiarze APK: Kotlin dodaje ~200-400 KB za bibliotekę kotlin-stdlib. Projekty Java mają mniejszy rozmiar APK ze względu na brak dodatkowego runtime'u, ale przy użyciu Java Stream API i Optional rozmiar APK może wzrosnąć z powodu desugaringu.

Narzędzia programisty Java dla Androida

Narzędzia programisty Java dla Androida obejmują Android Studio, Gradle, profiler i emulator. Android Studio — oficjalne IDE, oparte na IntelliJ IDEA Community, zawiera edytor z autouzupełnianiem Javy, analizator kodu (lint), refaktoryzację i wizualny edytor układów (Layout Editor).

Główne narzędzia

Android Gradle Plugin (AGP) w wersji 8.x zarządza budowaniem: kompilacja Javy do klas, desugaring, minifikacja ProGuard/R8, pakowanie do APK/AAB. R8 — ulepszony desugaring i obfuskator, zastępujący ProGuard. Build variants (debug/release + product flavors) konfiguruje się przez build.gradle. Gradle Daemon przyspiesza kolejne budowanie dzięki cache'owaniu.

groovy
// build.gradle (app) — konfiguracja modułu 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'
}

Blok compileOptions określa wersję Javy do kompilacji — Java 17 jest dostępna od AGP 8.x. Minimalne SDK (minSdk) określa minimalną wersję Androida, na której działa aplikacja. Target SDK — wersja, dla której aplikacja była testowana. Różnica między compileSdk a targetSdk: compileSdk — API do kompilacji, targetSdk — zachowanie runtime'u.

Ograniczenia Javy w tworzeniu aplikacji mobilnych

Ograniczenia Javy w Android stały się powodem przejścia Google na Kotlin. NullPointerException — najczęstszy wyjątek w aplikacjach Java-Android, ponieważ system typów nie rozróżnia referencji nullable i non-null. Google zaleca adnotacje @Nullable i @NonNull z pakietu androidx.annotation, ale kompilator ich nie sprawdza — robi to tylko lint.

Brak coroutines — kolejne ograniczenie: operacje asynchroniczne w Javie wymagają callbacków, AsyncTask (przestarzałe od API 30), ExecutorService lub RxJava. Prowadzi to do callback hell i wycieków pamięci przy obrocie ekranu. Kotlin coroutines z Structured Concurrency rozwiązują ten problem na poziomie języka: coroutine jest anulowana przy zniszczeniu Activity bez ręcznego zarządzania.

Kod szablonowy w Javie — źródło błędów przy ręcznym pisaniu equals/hashCode, implementacji Parcelable i ViewHolder dla RecyclerView. Biblioteki Android KTX i Jetpack Compose są zorientowane na Kotlin. Nowe API Androida (Room, Navigation, Compose) publikują przykłady w Kotlin domyślnie, choć wersje Java istnieją.

Często zadawane pytania

Czym jest Java?

Java — obiektowy język programowania od Sun Microsystems (1995), działający na maszynie wirtualnej JVM. Był głównym językiem Android SDK do 2019 roku. Używana w tworzeniu aplikacji mobilnych dla projektów legacy, backendu (Spring) i aplikacji korporacyjnych. Wyróżnia się ścisłym typowaniem, automatycznym zbieraniem śmieci i wieloplatformowością kodu bajtowego.

Dlaczego Java jest uważana za język legacy dla Androida?

Google ogłosił Kotlin priorytetowym językiem dla Androida w 2019 roku. Nowe biblioteki AndroidX, Jetpack Compose, zalecenia architektoniczne i domyślna dokumentacja są podawane w Kotlin. Java pozostaje w pełni wspierana, ale API są projektowane z podejściem Kotlin-first. Projekty Java wymagają więcej kodu szablonowego i nie otrzymują nowych możliwości językowych jako pierwsze.

Która wersja Javy jest używana w Android?

Android obsługuje Java 8 w pełni, Java 11 — częściowo od Android 12+, Java 17 — eksperymentalnie przez D8 desugaring. Android Gradle Plugin (AGP) 8.x transluje nowoczesny kod bajtowy na zgodny dla starszych API przez desugar. Programista może pisać w Javie 11+, używając lambd, Optional i DateTime API, ale records i sealed classes są dostępne tylko przez D8.

Czym Java różni się od Kotlina?

Kotlin wymaga mniej kodu: data class zastępuje dziesiątki linii Java boilerplate, null safety jest wbudowany w typy, coroutines upraszczają asynchroniczność. Java oferuje prostszą składnię dla początkujących, sprawdzony ekosystem bibliotek i stabilne narzędzia. Wydajność runtime'u jest identyczna — oba kompilują się do kodu bajtowego JVM, wykonywanego przez Android ART.

Jakie IDE są używane do tworzenia aplikacji Java na Androida?

Android Studio — standardowe IDE do tworzenia aplikacji na Androida z obsługą Javy i Kotlina. Zawiera emulator, profiler (CPU, memory, network), Layout Inspector, APK Analyzer. IntelliJ IDEA nadaje się do Javy po stronie serwera. Eclipse ADT jest przestarzałe i nie jest wspierane przez Google. Android Studio udostępnia również narzędzia do migracji kodu Java do Kotlina przez wbudowany konwerter.

Podsumowanie

  • Java — obiektowy język, który był głównym językiem Android SDK przez 11 lat
  • Kod bajtowy JVM jest translowany do DEX przez d8 i wykonywany przez Android Runtime (ART) z GC
  • Android obsługuje Java 8-17 z desugaringiem przez D8/R8 dla wstecznej zgodności
  • Java Activity — podstawowy komponent z cyklem życia onCreate → onStart → onResume → onPause → onStop → onDestroy
  • Gradle — system budowania z obsługą Java 17, AGP 8.x i build variants
  • Kotlin — następca Javy z tym samym kodem bajtowym, ale nowoczesną składnią i null safety
  • Java legacy stanowi ~35% projektów Android, Google kontynuuje wsparcie obu języków

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również