Java — یک زبان برنامهنویسی شیءگرا است که بیش از ده سال زبان اصلی Android SDK بود. علیرغم انتقال رسمی گوگل به 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 شد که توسط گوگل در سال 2008 منتشر شد.
معماری Java بر سه مؤلفه استوار است: JDK (Java Development Kit) — مجموعه ابزارهای توسعهدهنده، JRE (Java Runtime Environment) — محیط اجرا و JVM (Java Virtual Machine) — ماشین مجازی. Android از پیادهسازی خاص خود از JVM — Android Runtime (ART) استفاده میکند که در نسخه 5.0 (Lollipop) جایگزین Dalvik شد. 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 را از طریق desugaring 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 | Lambdaها, 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) تبدیل میکند که همراه با منابع و AndroidManifest.xml در APK بستهبندی میشوند.
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+ تبدیل میشود.
// یک Activity ساده Android در 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 متصل میکند. متد 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 به طور خودکار نوع اولیه را به شیء wrapper (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، زمانی که گوگل Kotlin را به عنوان زبان اولویتدار اعلام کرد. Kotlin کاملاً با Java سازگار است — هر دو به بایتکد JVM کامپایل میشوند، میتوانند یکدیگر را فراخوانی کنند و از کتابخانههای مشابه استفاده کنند. با این حال، رویکردهای نوشتن کد تفاوت اساسی دارند.
Kotlin پرگویی Java را حذف میکند: data class جایگزین 50+ خط کلاس Java با getter، setter، equals، hashCode، toString و copy میشود. Null safety در سیستم نوع Kotlin تعبیه شده است — NullPointerException عملاً غیرممکن است. توابع توسعه (Extension functions) امکان افزودن متد به کلاسهای موجود بدون ارثبری را میدهند. 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 |
| Lambdaها | FunctionalInterface + ::method | Lambdaها به طور پیشفرض |
| حاشیهنویسی DI | @Inject, @Module, @Provides | مشابه، اما کد کمتر |
از نظر عملکرد Java و Kotlin یکسان هستند — هر دو به بایتکد JVM کامپایل میشوند که Android ART آن را به طور یکسان اجرا میکند. تفاوت در اندازه APK: Kotlin حدود 200-400 KB برای کتابخانه kotlin-stdlib اضافه میکند. پروژههای Java به دلیل عدم وجود runtime اضافی اندازه APK کوچکتری دارند، اما با استفاده از Java Stream API و Optional اندازه APK به دلیل desugaring ممکن است افزایش یابد.
ابزارهای توسعهدهنده Java برای Android شامل Android Studio، Gradle، پروفایلر و شبیهساز است. Android Studio — IDE رسمی مبتنی بر IntelliJ IDEA Community، شامل ویرایشگر با تکمیل خودکار Java، تحلیلگر کد (lint)، بازآرایی و ویرایشگر بصری طرحبندی (Layout Editor).
Android Gradle Plugin (AGP) نسخه 8.x ساخت را مدیریت میکند: کامپایل Java به کلاسها، desugaring، کوچکسازی ProGuard/R8، بستهبندی به APK/AAB. R8 — desugaring و مبهمساز بهبودیافته که جایگزین 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 دلیلی برای انتقال گوگل به Kotlin شد. NullPointerException — رایجترین استثنا در برنامههای Java-Android، زیرا سیستم نوع بین ارجاعهای nullable و non-null تمایز قائل نمیشود. گوگل حاشیهنویسیهای @Nullable و @NonNull از بسته androidx.annotation را توصیه میکند، اما کامپایلر آنها را بررسی نمیکند — فقط lint این کار را انجام میدهد.
فقدان coroutines — محدودیت دیگر: عملیات ناهمگام در Java نیاز به callbackها، AsyncTask (منسوخ از API 30)، ExecutorService یا RxJava دارد. این منجر به callback hell و نشت حافظه در هنگام چرخش صفحه میشود. Kotlin coroutines با Structured Concurrency این مشکل را در سطح زبان حل میکند: coroutine هنگام نابودی Activity بدون مدیریت دستی لغو میشود.
کد قالبی در Java — منبع خطا در نوشتن دستی equals/hashCode، پیادهسازی Parcelable و ViewHolder برای RecyclerView. کتابخانههای Android KTX و Jetpack Compose به سمت Kotlin گرایش دارند. APIهای جدید Android (Room, Navigation, Compose) به طور پیشفرض مثالها را به Kotlin منتشر میکنند، اگرچه نسخههای Java وجود دارند.
سؤالات متداول
Java — یک زبان برنامهنویسی شیءگرا از Sun Microsystems (1995) است که روی ماشین مجازی JVM کار میکند. تا سال 2019 زبان اصلی Android SDK بود. در توسعه موبایل برای پروژههای قدیمی، بخش سرور (Spring) و برنامههای سازمانی استفاده میشود. با تایپ قوی، جمعآوری خودکار زباله و چندسکویی بودن بایتکد متمایز میشود.
گوگل در سال 2019 Kotlin را به عنوان زبان اولویتدار برای Android اعلام کرد. کتابخانههای جدید AndroidX، Jetpack Compose، توصیههای معماری و مستندات به طور پیشفرض به Kotlin ارائه میشوند. Java کاملاً پشتیبانی میشود، اما APIها با رویکرد Kotlin-first طراحی میشوند. پروژههای Java به کد قالبی بیشتری نیاز دارند و قابلیتهای جدید زبان را اولین بار دریافت نمیکنند.
Android از Java 8 به طور کامل، Java 11 — به طور جزئی با Android 12+، Java 17 — به طور آزمایشی از طریق D8 desugaring پشتیبانی میکند. Android Gradle Plugin (AGP) 8.x بایتکد مدرن را از طریق desugar به کد سازگار برای APIهای قدیمی ترجمه میکند. توسعهدهنده میتواند با Java 11+ با استفاده از lambdaها، Optional و DateTime API بنویسد، اما records و sealed classes فقط از طریق D8 در دسترس هستند.
Kotlin به کد کمتری نیاز دارد: data class جایگزین دهها خط کد قالبی Java میشود، null safety در انواع تعبیه شده است، coroutines ناهمگامی را ساده میکند. Java نحو سادهتری برای مبتدیان، اکوسیستم کتابخانهای اثباتشده و ابزارهای پایدار ارائه میدهد. عملکرد runtime یکسان است — هر دو به بایتکد JVM کامپایل میشوند که توسط Android ART اجرا میشود.
Android Studio — IDE استاندارد برای توسعه Android با پشتیبانی از Java و Kotlin. شامل شبیهساز، پروفایلر (CPU, memory, network)، Layout Inspector، APK Analyzer است. IntelliJ IDEA برای Java سمت سرور مناسب است. Eclipse ADT قدیمی است و توسط گوگل پشتیبانی نمیشود. Android Studio همچنین ابزارهایی برای مهاجرت کد Java به Kotlin از طریق مبدل داخلی ارائه میدهد.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید