ما هو المتغير
المتغير صندوق له اسم يحمل قيمة. في جافا لكل متغير نوع ثابت - يُحدَّد عند الإعلان عنه - ولا يتغير هذا النوع أبدًا. وهذا ما يجعل جافا ساكنة الكتابة (statically typed): يعرف المترجم نوع كل متغير قبل تشغيل البرنامج، وسيرفض ترجمة شيفرة تضع نوع القيمة الخطأ في الصندوق.
يتألف الإعلان من ثلاثة أجزاء: النوع، والاسم، و(عادةً) قيمة ابتدائية.
اقرأ int age = 30; بمعنى "أنشئ int اسمه age وضع فيه 30". الفاصلة المنقوطة تُنهي العبارة، تمامًا كما أوضحت صفحة التعليقات أن كل عبارة تفعل.
الإعلان الآن والإسناد لاحقًا
يمكنك فصل الإعلان عن أول إسناد له. يأتي النوع مرة واحدة، عند الإعلان؛ وبعد ذلك تُسند بالاسم و= فقط:
قاعدة تُربك المبتدئين: يجب أن تسند قيمة لمتغير محلي قبل أن تقرأه. يتتبع المترجم هذا ويرفض الشيفرة التي تقرأ متغيرًا محليًا غير مُهيّأ:
int score;
System.out.println(score); // compile error: variable score might not have been initialized
هذه ميزة لا مصدر إزعاج - فهي تلتقط صنفًا كاملًا من الأخطاء قبل أن يعمل البرنامج أصلًا.
قواعد التسمية والاصطلاحات
تفرض جافا بضع قواعد صارمة، ثم تضيف فوقها اصطلاحات. أما القواعد: يجوز أن يحتوي الاسم على حروف وأرقام و_ و$، لكن لا يجوز أن يبدأ برقم، ولا أن يكون كلمة محجوزة (مثل int أو class)، وهو حساس لحالة الأحرف (age وAge متغيران مختلفان).
الاصطلاحات التي يتبعها الجميع:
- المتغيرات والدوال تستخدم
camelCase:firstName،totalScore. - الثوابت تستخدم
UPPER_SNAKE_CASE:MAX_USERS. - يجب أن تصف الأسماء القيمة:
countلاc؛userEmailلاx.
الأسماء الواضحة ليست زخرفة - بل هي الطريقة التي يقرأ بها نفسُك المستقبلي الشيفرة. عبارة totalPrice = itemCount * pricePerItem واضحة بذاتها بطريقة لن تبلغها t = c * p أبدًا.
أمان الأنواع: الصندوق يحتفظ بنوعه
لأن النوع يُثبَّت عند الإعلان، لا يمكنك وضع قيمة من نوع خاطئ في متغير. وهذا يلتقط الأخطاء عند الترجمة:
int age = 30;
age = "thirty"; // compile error: incompatible types - String cannot become int
يتبع الإسناد بين الأنواع الرقمية قواعد التوسيع (widening) - النوع الأصغر يتدفق إلى الأكبر تلقائيًا، لكن ليس العكس. سنغطي ذلك بالكامل في صفحتَي أنواع البيانات وتحويل الأنواع؛ يكفي الآن أن تعرف أن المترجم يراقب.
الكلمة المفتاحية var
منذ جافا 10 يمكنك كتابة var بدل النوع وترك المترجم يستنتجه من القيمة الواقعة يمينًا:
var ليست كتابة ديناميكية - فـ name من النوع String تمامًا كما لو كتبت String name، ولا يزال يتعذر عليك لاحقًا إسناد int إليه. إنها توفّر الكتابة فقط. لكن الشرط: تحتاج var إلى قيمة ابتدائية تستنتج منها، لذا var x; غير قانوني، وتعمل فقط مع المتغيرات المحلية - لا مع الحقول أو معاملات الدوال أو أنواع الإرجاع. استخدمها حيث يكون النوع واضحًا من الطرف الأيمن؛ واكتب النوع صراحةً حين يضيف ذلك وضوحًا.
الثوابت باستخدام final
عندما لا ينبغي لقيمةٍ أن تتغير بعد ضبطها، علّمها بـ final. أي محاولة لإعادة إسنادها تصبح خطأ ترجمة:
تنقل final النية ("هذه قيمة ثابتة") وتدع المترجم يحرسها نيابةً عنك. استعن بها كلما كانت القيمة ثابتةً مفهوميًا - المعدلات، والحدود، ومفاتيح الإعداد - كي يُلتقط أي إسناد عرضي بدل أن يُشحن خطأ بصمت.
نطاق المتغير
يوجد المتغير فقط داخل الكتلة - الـ { ... } - التي أُعلن فيها، ويموت عند القوس المغلق. هذا هو نطاقه. المتغير المُعلن داخل حلقة أو كتلة if يكون غير مرئي خارجها:
كلٌّ من i وsquare ينتمي إلى الحلقة ويتلاشى عند انتهائها؛ أما total فمُعلن في الكتلة الخارجية، لذا يبقى. الخلاصة العملية: أعلن عن كل متغير في أصغر كتلة تحتاجه. النطاق الضيّق يعني أسماء أقل تتنافس على انتباهك وفرصًا أقل لإساءة استخدام قيمة بعيدًا عن موضع ضبطها.
التالي: أنواع البيانات
بدأ كل متغير في هذه الصفحة بنوع - int، double، String، boolean. تفصّل الصفحة التالية أنواع البيانات في جافا: الأنواع البدائية الثمانية، وحجم كل منها، والفرق بين الأنواع البدائية والكائنات، وأي نوع تختار ومتى.
الأسئلة الشائعة
كيف تُعلن عن متغير في جافا؟
اكتب النوع، ثم اسمًا، ثم اختياريًا أسند قيمة: int age = 30;. النوع (int) ثابت طوال عمر المتغير؛ والاسم (age) هو ما تشير به إليه. يمكنك تقسيمها إلى إعلان وإسناد لاحق - int age; age = 30; - لكن يجب أن تسند قيمة قبل أن تقرأ متغيرًا محليًا.
ما هي الكلمة المفتاحية var في جافا؟
منذ جافا 10، تتيح var للمترجم استنتاج نوع المتغير المحلي من القيمة التي تسندها: var name = "Ada"; يجعل name من النوع String. تبقى الكتابة ساكنة (static) - النوع يُحدَّد عند الترجمة لا ديناميكيًا. تعمل var فقط مع المتغيرات المحلية التي لها قيمة ابتدائية، ولا تصلح أبدًا للحقول أو المعاملات أو الإعلان غير المُهيّأ.
كيف تصنع ثابتًا في جافا؟
أضف الكلمة المفتاحية final: final double PI = 3.14159;. بمجرد إسناد قيمة لمتغير final لا يمكن إعادة إسناد قيمة له - يرفض المترجم أي محاولة. وبحسب الاصطلاح تُكتب الثوابت بصيغة UPPER_SNAKE_CASE كي تتميز عن المتغيرات العادية.