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("Здраво из Java!");
}
// Метод за обраду клика на дугме
public void onButtonClick(View view) {
TextView tv = findViewById(R.id.textView);
tv.setText("Дугме кликнуто");
}
}Класа MainActivity наслеђује AppCompatActivity — основну класу из AndroidX за уназад компатибилност. Метода onCreate се позива при креирању Activity-ја, у њој се поставља layout кроз setContentView. findViewById повезује Java променљиву са елементом из XML layout-а. Метода onButtonClick је повезана са дугметом кроз атрибут android:onClick у XML-у.
Животни циклус Activity-ја у Java — секвенца callback-ова: 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 класе са getter-има, setter-има, 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 KB за библиотеку kotlin-stdlib. Java пројекти имају мању величину APK због одсуства додатног runtime-а, али при коришћењу Java Stream API и Optional величина APK може порасти због десахаринга.
Алати Java програмера за Android укључују Android Studio, Gradle, профилер и емулатор. Android Studio — званично IDE, засновано на IntelliJ IDEA Community, укључује едитор са аутоматским довршавањем Java, анализатор кода (lint), рефакторисање и визуелни едитор layout-а (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 — понашање runtime-а.
Ограничења Java у Android-у су постала разлог преласка Google-а на Kotlin. NullPointerException — најчешћи изузетак у Java-Android апликацијама, јер систем типова не разликује nullable и non-null референце. Google препоручује анотације @Nullable и @NonNull из пакета androidx.annotation, али компајлер их не проверава — то ради само lint.
Недостатак корутина — још једно ограничење: асинхроне операције у Java захтевају callback-ове, AsyncTask (застарео од API 30), ExecutorService или RxJava. Ово доводи до callback hell-а и цурења меморије при ротацији екрана. Kotlin coroutines са Structured Concurrency решавају овај проблем на нивоу језика: корутина се отказује при уништењу Activity-ја без ручног управљања.
Шаблонски код у Java — извор грешака при ручном писању equals/hashCode, Parcelable имплементација и ViewHolder-а за RecyclerView. Android KTX библиотеке и Jetpack Compose су оријентисани на Kotlin. Нови Android API-ји (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 boilerplate-а, null safety је уграђен у типове, корутине поједностављују асинхроност. Java нуди једноставнију синтаксу за почетнике, проверени екосистем библиотека и стабилне алате. Перформансе runtime-а су идентичне — оба се компајлирају у 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође