Menu
flag Ar iconالعربيةdown icon

أنواع البيانات في جافا: الأنواع البدائية وأنواع المرجع والقيم الافتراضية

شرح أنواع البيانات في جافا - الأنواع البدائية الثمانية، وأنواع المرجع، والقيم الافتراضية، والحرفيات واللواحق، والفيضان (overflow)، ومتى تستخدم أي نوع رقمي.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

عائلتان: الأنواع البدائية وأنواع المرجع

لكل قيمة في جافا نوع، وهذا النوع يقع ضمن إحدى عائلتين. الأنواع البدائية تخزّن قيمة خامًا مباشرةً - عددًا، أو حرفًا واحدًا، أو صحيحًا/خطأ. أما أنواع المرجع فتخزّن مرجعًا (مؤشرًا) إلى كائن يقيم في مكان آخر من الذاكرة: String، والمصفوفات، وكل صنف تُعرّفه أنت أو المكتبات.

هذا التمييز مهم لأن الأنواع البدائية خفيفة وتُنسخ بالقيمة، بينما تشير متغيرات المرجع إلى كائنات مشتركة. ابدأ بالأنواع البدائية الثمانية - فهي الأساس الذي يُبنى عليه كل ما سواها.

الأنواع البدائية الثمانية

تحتوي جافا على ثمانية أنواع بدائية مدمجة بالضبط. ستة منها أعداد، وواحد حرف، وواحد قيمة منطقية:

بضعة أمور ينبغي ملاحظتها منذ البداية: الشُّرَط السفلية في 2_000_000 مجرد فواصل بصرية يتجاهلها المُترجِم، واللاحقتان L وf إلزاميتان (المزيد عن ذلك أدناه)، وchar يستخدم علامتي اقتباس مفردتين بينما يستخدم String علامتي اقتباس مزدوجتين.

اختيار نوع رقمي

نادرًا ما تحتاج إلى byte أو short - فهما لا يوفّران الذاكرة إلا في المصفوفات الضخمة. القرارات الحقيقية تكون بين int/long للأعداد الصحيحة وfloat/double للأعداد العشرية.

النوعالحجماستخدمه عندما
int32 بتالافتراضي للأعداد الصحيحة (حتى نحو 2.1 مليار)
long64 بتالقيم التي تتجاوز نحو ملياري وحدة: الطوابع الزمنية بالمللي ثانية، أحجام الملفات
double64 بتالافتراضي للأعداد العشرية - دقة جيدة
float32 بتفقط عندما تكون الذاكرة شحيحة ويمكن التضحية بالدقة

الفخّ هو الفيضان (overflow). يلتفّ int بصمت عندما يتجاوز نطاقه - بلا أي خطأ، بل مجرد إجابة خاطئة:

يفيض maxInt + 1 إلى -2147483648 لأن كلا المعاملَين من النوع int وتبقى النتيجة من النوع int. أما تحويل أحد الطرفين إلى long أولًا فيُجري الحساب بـ 64 بت. عندما يُحتمل أن تكون القيمة كبيرة - خصوصًا المللي ثوانٍ منذ عام 1970 - فالجأ إلى long.

الحرفيات ولواحقها

للحرفي الرقمي المجرّد نوع افتراضي، وهذا ما يوقع الناس في الخطأ. الرقم 100 هو int، والرقم 3.14 هو double. ولكتابة حرفي long أو float يجب أن تضيف لاحقة:

احذف الحرف L من 8_000_000_000L ولن تُترجَم الشيفرة، لأن الحرفي يتجاوز نطاق int قبل أن يصل أصلًا إلى متغير long. واحذف الحرف f من 0.5f فتشتكي جافا من أنه لا يمكن إسناد قيمة double إلى float من دون تحويل صريح. اللاحقة لا تفرّق بين الأحرف الكبيرة والصغيرة، لكن استخدم الحرف الكبير L - فالحرف الصغير l يشبه الرقم 1 تمامًا.

char عددٌ متنكّر

يخزّن char وحدة ترميز يونيكود بـ 16 بت، ما يعني أنه يؤدي أيضًا دور عدد صحيح صغير بلا إشارة. يمكنك إجراء عمليات حسابية عليه وتحويله ذهابًا وإيابًا عبر التحويل الصريح (cast):

هذا مفيد أحيانًا لإزاحة الأحرف، لكن لا تعتمد عليه في معالجة النصوص - فلهذا الغرض وُجد String. لاحظ أن char يستخدم علامتي اقتباس مفردتين ('A')؛ أما علامتا الاقتباس المزدوجتان ("A") فتُنشئان String بحرف واحد، وهو نوع مختلف تمامًا.

القيم الافتراضية (وفخّ المتغيرات المحلية)

تحصل الحقول وعناصر المصفوفات التي لا تهيّئها على قيمة افتراضية منطقية. لكن هذا ينطبق على الحقول وخانات المصفوفات فقط - أما المتغيرات المحلية فلا تحصل على أي قيمة افتراضية، واستخدام أحدها قبل إسناد قيمة إليه هو خطأ في الترجمة، لا مفاجأة في وقت التشغيل.

لو كتبت بدلًا من ذلك int x; System.out.println(x); داخل main، لرفضها المُترجِم بالرسالة "variable x might not have been initialized". هذه الصرامة ميزة - فهي تمنعك من قراءة قيم عشوائية. القيم الافتراضية الجديرة بالتذكّر: الأنواع الرقمية 0، وboolean تساوي false، وchar تساوي ' '، وكل نوع مرجع يساوي null.

التالي: Strings

String هو نوع المرجع الذي ستتعامل معه أكثر من غيره - النصوص، والقيم المدمجة، ومدخلات المستخدم. وهو يتصرف بشكل مختلف عن الأنواع البدائية المذكورة هنا: فهو كائن، وهو غير قابل للتغيير (immutable)، ولمقارنة النصوص مزالقها الخاصة. الصفحة التالية تتناوله.

الأسئلة الشائعة

كم عدد أنواع البيانات في جافا؟

تحتوي جافا على ثمانية أنواع بدائية: byte وshort وint وlong وfloat وdouble وchar وboolean. وكل ما سوى ذلك - String والمصفوفات وأي كائن - هو نوع مرجع. إذن عدد الأنواع البدائية المدمجة ثابت عند ثمانية، بينما أنواع المرجع غير محدودة لأنك (والمكتبات) تُعرّفون أصنافًا جديدة.

ما الفرق بين int و long في جافا؟

كلاهما يخزّن أعدادًا صحيحة، لكن int بحجم 32 بت (نطاق نحو ±2.1 مليار) وlong بحجم 64 بت (نطاق نحو ±9.2 كوينتيليون). استخدم int افتراضيًا؛ وانتقل إلى long عندما يمكن أن تتجاوز القيمة ملياري وحدة - الطوابع الزمنية بالمللي ثانية، وأحجام الملفات، والعدّادات الكبيرة. يحتاج حرفي long إلى اللاحقة L، مثل long big = 10000000000L;.

ما القيمة الافتراضية لـ int في جافا؟

القيمة الافتراضية لـ حقل من النوع int هي 0 - لكن الحقول وعناصر المصفوفات فقط هي التي تحصل على قيم افتراضية. القيمة الافتراضية لـ long هي 0L، ولـ double هي 0.0، ولـ boolean هي false، ولـ char هي '\u0000'، ولأي نوع مرجع هي null. أما المتغيرات المحلية فلا تحصل على أي قيمة افتراضية على الإطلاق - يجب أن تسند إليها قيمة قبل الاستخدام وإلا فلن تُترجم الشيفرة.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن