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": يتم تنفيذ bytecode جافا المترجم على أي منصة مثبت عليها الآلة الافتراضية 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 bytecode DEX، الذي يُترجم من bytecode جافا عبر أداة dx/d8.
ميزة رئيسية لـ Java هي إدارة الذاكرة التلقائية عبر Garbage Collector (GC). لا يحتاج المطور إلى تحرير الذاكرة بشكل صريح — يتتبع GC الكائنات غير المستخدمة ويزيلها. في Android ART، يتم استخدام Concurrent Mark Sweep (CMS) و Generational GC، المُحسَّنين للموارد المحدودة للأجهزة المحمولة. هذا يقلل العبء على المطور، لكنه قد يسبب "تباطؤًا" أثناء جمع القمامة في سلسلة واجهة المستخدم.
يدعم 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 | لامدا، 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 (أداة تعبئة الأصول)، المحاكي ومكتبات android.* و java.*. يكتب المطور الكود بلغة Java، ويُجمعه إلى ملفات .class (bytecode 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+ دون تغييرات في كود المطور المصدر.
// نشاط 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("Hello from Java!");
}
// طريقة لمعالجة النقر على الزر
public void onButtonClick(View view) {
TextView tv = findViewById(R.id.textView);
tv.setText("Button clicked");
}
}الفئة MainActivity ترث AppCompatActivity — فئة أساسية من AndroidX للتوافق مع الإصدارات السابقة. يتم استدعاء طريقة onCreate عند إنشاء Activity، فيها يتم تعيين التخطيط عبر setContentView. يربط findViewById متغير Java بعنصر من تخطيط XML. طريقة onButtonClick مرتبطة بالزر عبر السمة android:onClick في XML.
دورة حياة Activity في Java هي سلسلة من الاستدعاءات: onCreate → onStart → onResume (نشط)، onPause → onStop → onDestroy (إنهاء). يقوم المطور بتجاوز هذه الطرق لإدارة الموارد. onCreate — تهيئة، onPause — حفظ البيانات، onDestroy — تحرير الموارد. يستدعي Android هذه الطرق عند تدوير الشاشة، الدخول في الخلفية واستقبال مكالمة.
// دورة حياة النشاط مع إدارة الحالة
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 يحتوي على فئة عامة واحدة يتطابق اسمها مع اسم الملف. لا تدعم Java الدوال خارج الفئات — كل شيء هو طريقة. نقطة الدخول هي الطريقة الثابتة public static void main(String[] args) للتطبيقات الطرفية أو طرق دورة حياة Android Activity للتطبيقات المحمولة.
Java تقسم الأنواع إلى أنواع بدائية (int, double, boolean, char, byte, short, long, float) وأنواع مرجعية (فئات، واجهات، مصفوفات، enum). تُخزَّن البدائيات على المكدس وتُمرَّر بالقيمة. الكائنات في الكومة، تُمرَّر بالمرجع. التحويل التلقائي (autoboxing) يحول البدائي تلقائيًا إلى كائن غلاف (Integer, Double, Boolean)، لكنه ينشئ كائنات إضافية — في Android هذا أمر بالغ الأهمية لأداء واجهة المستخدم.
// أمثلة على أنواع البيانات وهياكل 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<>();
// طريقة مع الأدوات الجينية
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 — كلاهما يُترجمان إلى bytecode JVM، يمكنهما استدعاء بعضهما البعض واستخدام نفس المكتبات. ومع ذلك، تختلف طرق كتابة الكود بشكل جذري.
تزيل Kotlin الإسهاب في Java: data class تحل محل 50+ سطرًا من فئة Java مع getters و setters و equals و hashCode و toString و copy. أمان القيم الخالية مدمج في نظام أنواع Kotlin — NullPointerException مستحيلة عمليًا. دوال الامتداد تسمح بإضافة طرق إلى الفئات الموجودة دون وراثة. Smart Casts تحول الأنواع تلقائيًا بعد التحقق.
| الجانب | Java | Kotlin |
|---|---|---|
| أمان القيم الخالية | تعليقات @Nullable / @NonNull | String? / String — مدمج |
| Data class | 50+ سطرًا مع Lombok | data class User(val name: String) |
| الامتداد | فئات أدوات ثابتة | fun String.isEmail(): Boolean |
| Coroutines | AsyncTask / ExecutorService | suspend + Structured Concurrency |
| لامدا | FunctionalInterface + ::method | لامدا افتراضيًا |
| تعليقات DI | @Inject, @Module, @Provides | مماثل لكن بكود أقل |
من حيث الأداء، Java و Kotlin متطابقتان — كلاهما يُترجم إلى bytecode JVM، الذي ينفذه Android ART بنفس الطريقة. الفرق في حجم APK: Kotlin تضيف ~200-400 كيلوبايت لمكتبة kotlin-stdlib. مشاريع Java لها حجم 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. يتم تكوين متغيرات البناء (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 هو سلوك وقت التشغيل.
قيود Java في Android أدت إلى انتقال Google إلى Kotlin. NullPointerException هو الاستثناء الأكثر شيوعًا في تطبيقات Java لنظام Android، لأن نظام الأنواع لا يميز بين المراجع القابلة للخالية وغير القابلة للخالية. توصي Google بتعليقات @Nullable و @NonNull من حزمة androidx.annotation، لكن المترجم لا يتحقق منها — فقط lint يفعل ذلك.
غياب coroutines هو قيد آخر: العمليات غير المتزامنة في Java تتطلب استدعاءات رد، AsyncTask (مهمل منذ API 30)، ExecutorService أو RxJava. هذا يؤدي إلى جحيم الاستدعاءات وتسريبات الذاكرة عند تدوير الشاشة. تحل coroutines في Kotlin مع Structured Concurrency هذه المشكلة على مستوى اللغة: يتم إلغاء coroutine عند تدمير Activity دون إدارة يدوية.
كود القالب في Java هو مصدر أخطاء عند كتابة equals/hashCode يدويًا وتنفيذ Parcelable و ViewHolder لـ RecyclerView. مكتبات Android KTX و Jetpack Compose موجهة نحو Kotlin. واجهات برمجة التطبيقات الجديدة لنظام Android (Room, Navigation, Compose) تنشر أمثلة بلغة Kotlin افتراضيًا، على الرغم من وجود إصدارات Java.
الأسئلة المتكررة
Java هي لغة برمجة كائنية التوجه من Sun Microsystems (1995)، تعمل على الآلة الافتراضية JVM. كانت اللغة الرئيسية لـ Android SDK حتى 2019. تُستخدم في التطوير المحمول للمشاريع القديمة والجزء الخادم (Spring) والتطبيقات المؤسسية. تتميز بالكتابة القوية وجمع القمامة التلقائي وتعدد المنصات للbytecode.
أعلنت Google Kotlin كلغة ذات أولوية لنظام Android في 2019. مكتبات AndroidX الجديدة و Jetpack Compose وتوصيات البنية التحتية والوثائق تُقدم افتراضيًا بلغة Kotlin. تظل Java مدعومة بالكامل، لكن واجهات برمجة التطبيقات تُصمم بنهج Kotlin-first. تتطلب مشاريع Java كود قالب أكثر ولا تحصل على ميزات لغة جديدة أولاً.
يدعم Android بالكامل Java 8، وجزئيًا Java 11 منذ Android 12+، و Java 17 تجريبيًا عبر desugaring D8. Android Gradle Plugin (AGP) 8.x يترجم bytecode الحديث إلى كود متوافق لواجهات برمجة التطبيقات القديمة عبر desugar. يمكن للمطور الكتابة بلغة Java 11+ باستخدام لامدا و Optional و DateTime API، لكن records و sealed classes متاحة فقط عبر D8.
Kotlin تتطلب كودًا أقل: data class تحل محل عشرات الأسطر من كود القالب في Java، أمان القيم الخالية مدمج في الأنواع، coroutines تبسط العمليات غير المتزامنة. Java تقدم بناء جملة أبسط للمبتدئين ونظامًا بيئيًا مثبتًا للمكتبات وأدوات مستقرة. أداء وقت التشغيل متطابق — كلاهما يُترجم إلى bytecode 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. سوف نقدم لك النصح ونقترح أفضل حل.