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 — 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.
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 Javy | Android API (min) | Wersja Androida | Kluczowe funkcje |
|---|---|---|---|
| Java 7 | API 19 | 4.4 KitKat | try-with-resources, multi-catch |
| Java 8 | API 24 | 7.0 Nougat | Lambdy, Stream API, Optional |
| Java 11 | API 31 | 12 | HTTP Client, Local-Variable Syntax |
| Java 17 | API 34 | 14 | Records, Sealed Classes (D8) |
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.
// 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.
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.
// 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 — 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.
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.
// 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.
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.
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.
| Aspekt | Java | Kotlin |
|---|---|---|
| Null safety | @Nullable / @NonNull adnotacje | String? / String — wbudowane |
| Data class | 50+ linii z Lombok | data class User(val name: String) |
| Extension | Statyczne klasy narzędziowe | fun String.isEmail(): Boolean |
| Coroutines | AsyncTask / ExecutorService | suspend + Structured Concurrency |
| Lambdy | FunctionalInterface + ::method | Lambdy domyślnie |
| Adnotacje DI | @Inject, @Module, @Provides | Analogicznie, ale mniej kodu |
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 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).
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.
// 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 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
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.
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.
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.
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.
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
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.
Przeczytaj również