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

أصناف جافا: تعريف الحقول والدوال والكائنات

ما هو الصنف في جافا، وكيفية تعريف الحقول والدوال، وإنشاء الكائنات باستخدام new، ودور this، ولماذا تُحفظ حالة النسخة في الكائن.

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

الصنف مخطط

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

يُعلِن الصنف نوعين من الأعضاء: الحقول (البيانات التي يحملها كل كائن) والدوال (ما يستطيع كل كائن فعله).

يبني new Dog() كائنًا في الذاكرة ويمنحك مرجعًا إليه. ويصل d.name وd.bark() إلى ذلك الكائن المحدّد.

لكل كائن حالته الخاصة

جوهر الصنف هو أنّك تستطيع إنتاج كائنات مستقلة كثيرة، يحمل كلٌّ منها قيم حقوله الخاصة. تغيير أحدها لا يمسّ الآخر أبدًا.

rex وbella كائنان منفصلان. لكلٍّ منهما حقل name خاص به، لذا يطبع كل استدعاء لـ bark() قيمة مختلفة. تُسمّى هذه البيانات الخاصة بكل كائن حالة النسخة.

الحقول والدوال تعمل معًا

تستطيع الدوال داخل الصنف أن تقرأ حقول الكائن نفسه وتحدّثها مباشرة، دون الحاجة إلى تمريرها كمُعامِلات. فالدالة "تعيش أصلًا على" الكائن الذي تمسّ بياناته.

لاحظ أنّ increment() لا تأخذ أيّ وسائط. إنّها تعمل على الحقل العائد إلى الـ Counter الذي استدعيتها عليه. هذا هو الفرق بين دالة الصنف والدالة الساكنة المستقلة: للدالة كائن ضمني تعمل عليه.

الكلمة المفتاحية this

داخل الدالة، this مرجع إلى الكائن الذي استُدعيت الدالة عليه. عادةً لا تحتاج إليها، فكتابة count تعني this.count بالفعل. لكنّ this تصبح ضرورية عندما يتعارض اسم مُعامِل مع اسم حقل، وهو ما يحدث باستمرار في دوال الضبط والبنّاءات.

من الأخطاء الشائعة لدى المبتدئين كتابة x = x; داخل move. هذا يسند المُعامِل إلى نفسه فقط ويترك الحقل دون مساس: لن يحذّرك المترجم، وسيحتفظ كائنك بقيمه القديمة بصمت. أمّا this.x = x; فهو ما يحدّث الحقل فعليًا.

القيم الافتراضية للحقول والمراجع null

عندما تنشئ كائنًا، لا تبقى حقوله بقيم عشوائية، بل تهيّئها جافا بقيم افتراضية: 0 للأعداد، وfalse لـ boolean، وnull لمراجع الكائنات مثل String. هذه القيمة الافتراضية null هي مصدر انهيار كلاسيكي.

قيمة u.name هي null لأنّ أحدًا لم يضبطها، لذا فإنّ استدعاء .length() عليها يرمي NullPointerException. أسنِد دائمًا قيمًا ذات معنى إلى الكائن قبل استخدام حقوله، وهذه بالضبط المشكلة التي تحلّها البنّاءات.

تنظيم الشيفرة حول الأصناف

تنمذج البرامج الحقيقية مجالها كأصناف تجمع البيانات والعمليات التي تطرأ عليها معًا. هنا يحتفظ صنف BankAccount واحد برصيد ويضبط كيفية تغيّره:

تعيش البيانات (balance) وقواعد تغييرها (deposit وwithdraw) في مكان واحد. وتطلب الشيفرة في مواضع أخرى من الحساب أن يقوم بأشياء بدلًا من العبث بأرقامه مباشرة، وهذا أساس التصميم النظيف القابل للصيانة.

التالي: البنّاءات

ضبط كل حقل يدويًا بعد new أمر مُمِلّ وسهل النسيان، وكما رأيت للتو، فإنّ حقلًا منسيًّا يترك null ينتظر ليسبّب انهيارًا. يتيح لك البنّاء أن تشترط حقول الكائن وتهيّئها في لحظة إنشائه نفسها، بحيث لا يمكن أن يوجد BankAccount أبدًا دون مالك. هذا هو موضوع الصفحة التالية.

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

ما هو الصنف في جافا؟

الصنف هو مخطط يحدّد البيانات (الحقول) والسلوك (الدوال) التي سيمتلكها نوع معيّن من الكائنات. الصنف نفسه ليس سوى قالب، أمّا الكائنات الفعلية فتنشئها منه باستخدام new. على سبيل المثال، يصف الصنف Dog أنّ لكل كلب حقل name ويستطيع تنفيذ bark()، بينما كل new Dog() هو كلب منفصل له اسمه الخاص.

ما الفرق بين الصنف والكائن في جافا؟

الصنف هو التعريف، أمّا الكائن فهو نسخة محسوسة مبنية من ذلك التعريف باستخدام new. يمكن لصنف Person واحد أن يُنتج العديد من كائنات Person، يحمل كلٌّ منها قيم حقوله الخاصة. تخيّل الصنف كقالب الكعك والكائنات كقطع الكعك الفردية: تغيير حقول كائن واحد لا يؤثّر أبدًا على غيره.

ماذا تفعل الكلمة المفتاحية this في صنف جافا؟

تشير this إلى الكائن الحالي، أي النسخة المحدّدة التي تُنفَّذ دالتها الآن. تستخدمها للوصول إلى حقول الكائن نفسه، خصوصًا عندما يحمل مُعامِل الاسم نفسه لحقل ما (this.name = name;). من دون this فإنّ الإسناد يضع المُعامِل في نفسه فقط ويبقى الحقل دون تغيير.

Coddy programming languages illustration

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

ابدأ الآن