الرئيسيةعريقبحث

الفئات والكائنات في لغة الجافا

كلمه This

☰ جدول المحتويات


الفئات Classes

هو حجر الزاوية في لغة الجافا حيث تعتبر الفئات الوحدات الأساسية في لغة البرمجة الكائنية نظرا لما تحتويه Classes الفئات من كائنات و طرق وبيانات.

تعريف الفئة

الفئة هي القالب البرمجي للغة الجافا الذي يحدد شكل الكائنات لما تحتويه من بيانات و معاملات والكائن ينتمي للفئة وليس العكس وبالتالي للفئة عناصر منها المتغيرات و النهج (الدوال –الطرق) إذا الفئة هي كالمستودع الذي يستطيع المبرمجون ان يجمعوا فيه البيانات و الطرق ( الدوال) تحت سقف واحد.

إنشاء الفئات

يتم إنشاء الفئات بإستخدام الكلمة المفتاحية class وهي من الكلمات المحجوزة في الجافا ويكون الشكل العام للفئة كما يلي:

(انشاء فئة جديده)


هذا إذا كان برنامجنا يحتوي على عدة فئات مجتمعه في ملف واحد وبالتالي فإن الفئة الرئيسية التي تحتوي على الدالة Main تبدأ بمحدد الوصول Public class أي أن الفئة عامة، وتبدأ جميع الفئات الأخرى بالكلمة المحجوزه Class كما في الصورة السابقه

(الفئة الرئيسية)

أما إذا كان برنامجنا يحتوي على عدة فئات كلا في ملف منفصل فلابد من كل الفئات ان تبدأ Public class ويجب أن تحتوي اي فئة على دالة واحده متغير واحد على الاقل أو كلاهما وحين نريد أن نصمم فئة يجب أن نراعي نوع البيانات ومدى موافقتها معا داخل الفئة بمعنى لو كانت الفئة مثلا مصممه لتخزين أسماء موظفين وأرقام هواتفهم وعناوينهم لن يكون مناسب أن أضع بنفس الفئة بيانات عن حالة الطقس وحالة البحر ومعدل سقوط الأمطار، ولذلك يجب أن نراعي الناحية المنطقية عند تصميم الفئة من حيث علاقة البيانات التي نريد التعامل معها في نفس الفئة.

الكائنات Objects

هي المفتاح لمفهوم البرمجة كائنة التوجه تعتبر الكائنات البرمجية مشابهة للكائنات الحقيقية من حيث المبدأ: كلاهما يتجلى في حالة وسلوكات. الكائن يخزن حالته في حقول (fields) (تسمى متغيرات في لغات برمجية أخرى) ويعرض تصرفاته من خلال طرق (methods) تسمى دوال (functions) في لغات برمجية أخرى. الطرق تعمل على الحالة الخاصة بالكائنات، وتشكل الآلية الأساسية للتواصل بين الكائنات. إخفاء الحالة واشتراط أن يكون كل تفاعل مع الكائن يمر عبر الطرق الخاصة به، يعرف ب تغليف البيانات (Data encapsulation)، وهو مبدأ أساسي في البرمجة الكائنية التوجه. لنأخذ الدراجة كمثال: عندما نحدد الحالة (السرعة الحالية، الإيقاع الحالي للدواسة، الدولاب الحالي) ونوفر الطرف التي تستطيع تغيير هذه الحالة، فإن الكائن يبقى متحكما في الطريقة المتاحة لاستعماله من أي عنصر خارجي. مثلا، إذا كانت الدراجة تتوفر فقط على 6 دواليب، فإن الطريقة التي تقوم بتغيير الدولاب يمكنها أن ترفض أي قيمة أصغر من 1 وأكبر من 6.

  • تجميع الكود في كائنات برمجية يوفر عدة مزايا، من بينها:
  1. ال Modularity : الكود المصدري لكائن ما يمكن أن تتم كتابته وصيانته بطريقة مستفلة عن الكائنات الأخرى. بعد إنشائه، يمكن تمرير الكائن بسهولة في أنحاء النظام.
  2. إخفاء المعلومات: بفضل التعامل مع الطرق الخاصة بالكائن فقط، يبقى التطبيق (implementation) مخفيا عن العالم الخارجي.
  3. إعادة استعمال الكود: إذا كان كائن ما موجود مسبقا (كتبه مبرمج آخر مثلا)، يمكنك استعمال هذا الكائن داخل برنامجك. هذا يسمح للمختصين بعمل implement/test/debug لكائنات معقدة وموجهة لغرض محدد، مما يجعلك تشتغل بها بكل ثقة داخل الكود.
  4. سهولة ال Pluggability and debugging: إذا اتضح أن كائنا يخلق مشاكل، يمكن إزالته وربط كائن آخر ليشغل مكانه. هذا الأمر مشابه لإصلاح المشاكل الميكانيكية في الواقع. إذا تعطل الصاعق، فإنك تغيره وحده، ولا تغير كل المحرك.

العلاقة بين الفئات Relational between Classes

من أشهر العلاقات بين الفئات هي:

-الاعتماد "يستخدم-واحد" (uses–a).

-التجميع "تمتلك –واحد" ( has–a).

-الميراث "هو –واحد" (is–a).

الاعتماد (يستخدم –واحد )

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

علاقة التجميع (تمتلك واحد )

هي علاقة سهلة الفهم لانها علاقة ملموسه. على سبيل المثال كائن الطلب يحتوي على كائنات السلعة. الاحتواء يعني أن الكائنات من الفئة (أ) تحتوي على كائنات من الفئة (ب).

ملاحظة: بعض المنهجيات تعرض مفهوم التجميع بإزدراء وتفضل استخدام علاقة (الارتباط) من وجهة نظر النمذجه ولكن المبرمجين في وجهة نظرهم علاقة التجميع تقدم الكثير من المعاني الملموسه. ولكن يتم استخدام التجميع لسبب اخر وهو الترميز الموحد للارتباط وهو اقل وضوح. انظر الجدول

لغة النمذجة الموحده (UML) لترميزعلاقات الفئات

الميراث(هو-واحد)

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

العديد من المبرمجين يستخدمون ترميز لغة النمذجة الموحده (UML) لرسم مخططات الفئة التي تصف العلاقات بين الفئات.على سبيل المثال في الرسم البياني للفئات يتم رسم الفئات على شكل مستطيلات ورسم العلاقات على شكل اسهم مع مختلف اشكالها الجدول السابق يوضع أهم الاشكال.


استخدام فئات معرفه مسبقا

لايمكن القيام باي شيء في الجافا من دون استخدام الفئات، وأنت بالفعل رأيت العديد من الفئات أو تعاملت معها أثناء عملك. ومع ذلك لم يظهر لك جميع الميزات النموذجيه أو التقليديه لكائنات التوجه.
على سبيل المثال، فئة الرياضيات 'Math class' يمكن استخدام أساليب أو طرق (method) لفئة الرياضيات، مثل Math.random،من دون الحاجة إلى معرفة كيف يتم تنفيذها، فقط ماتحتاج اليه هو معرفة الاسم والمعلمات (parameters) إن وجدت.
هذه هي نقطة الكبسلة أو التغليف (encapsulation) وسوف تنطبق بشكل صحيح على جميع الفئات. ولكن فئة الرياضيات تقوم بكبسلة الوظيفة فقط من دون الحاجة إلى اخفاء البيانات. بسبب عدم وجود بيانات. لذا لاداعي للقلق حول كيفية انشاء الكائنات وتهيئة نماذج حقولها.

الكائنات و متغيرات الكائنات

للعمل مع كائنات يمكنك أولاً البناء عليها وتحديد حالتها الأولية. ثم قمت بتطبيق أساليب للكائنات.
في لغة البرمجة جافا، يمكنك استخدام منشئات لبناء الحالات الجديدة. المنشئ هو أسلوب خاص الذي يهدف إلى بناء وتهيئة الكائنات. دعونا نلقي نظرة على مثال. مكتبة جافا القياسية تحتوي على فئة التاريخ. الكائنات الخاصة بها تصف النقاط في الوقت المناسب مثل "كانون، ديسيمبر 31, 1999, 23:59:59 بِتَوْقِيت غْرِينِتْش".

  • ملاحظة: يمكنك أن تتساءل لماذا استخدام الفئات لتمثيل التواريخ بدلاً من كما هو الحال في بعض اللغات المدمج في كتابة على سبيل المثال" Visual Basic" يحتوي على نوع تاريخ مضمن و والمبرمجين يمكن تحديد التواريخ في تنسيق #6/1/1995#. على السطح هذه الأصوات مريحة ويمكن ببساطة استخدام المبرمجين نوع التاريخ المضمنة بدلاً من القلق بشأن الفئات. ولكن فعلا مدى تصميم "Visual Basic" لبعض التواريخ يتم تحديدها ب"شهر،يوم، سنة" وفي مجالات اخرى "يوم،شهر، سنة".

تم تجهيز مصممي اللغة حقاً التنبؤ بهذه الأنواع من القضايا؟ إذا أنهم يقومون بعمل فقير اللغة يصبح مشوشا وغير سارة، ولكن المبرمج التعيس عاجزة عن القيام بأي شيء حيال ذلك. مع الفئات هو تفريغ مهمة تصميم لمصمم مكتبة. إذا كانت الفئة غير مثالية يمكن بسهولة كتابة المبرمجين الآخرين فئات الخاصة بهم لتحسين أو استبدال نظام الطبقات. لإثبات هذه النقطة "جافا" مكتبة التاريخ مشوش قليلاً، وتجري حاليا إعادة تصميم رئيسي يمكنك زيارة الرابط التالي: http://jcp.org/en/jsr/detail?id=310
المنشئات دائماً لها نفس الاسم كاسم الفئة. وهكذا يسمى المنشئ لفئة التاريخ تاريخ. لإنشاء كائن تاريخ يمكنك دمج المنشئ مع المشغل الجديد كما يلي:
()new Date هذا التعبير يبني كائن جديد. تتم تهيئة الكائن إلى الوقت والتاريخ الحاليين. إذا كنت تريد، يمكن تمرير الكائن إلى أسلوب:

(()System.out.println(new Date

وبدلاً من ذلك يمكنك تطبيق أسلوب للكائن الذي كنت شيدت فقط. أحد الأساليب لفئة التاريخ هو الأسلوب" toString". أن يستدعي اسلوب تمثيل سلسلة للتاريخ. هنا كيف أن تطبيق الأسلوب toString على كائن تاريخ المشيدة حديثا:

()String s =new Date().toString

يتم استخدام الكائن شيدت مرة واحدة فقط في هذين المثلين. عادة سوف تحتاج إلى الصمود على الكائنات التي يمكنك بناء حيث أنه يمكنك يمكن الحفاظ على استخدامها. ببساطة يمكنك تخزين الكائن في متغير:

()Date birthday = new Date

وهناك فارق هام بين الكائنات ومتغيرات الكائن.
-فعلى سبيل المثال البيان:
Date desdline; // deadline doesn't refer to any object تعريف كائن المتغير "deadline" يمكن أن تشير إلى كائنات نوع التاريخ. من المهم أن ندرك أن المتغير "deadline" هو ليس كائن، وفي الواقع لا بعد حتى يشير إلى كائن. لا يمكنك استخدام أي أساليب التاريخ على هذا المتغير في هذا الوقت. مثال:
s = deadline.toString(); // not yet سوف يؤدي إلى خطأ في وقت التحويل البرمجي. يجب عليك أولاً أن تهيئة متغير "deadline" . لديك خيارين بالطبع يمكنك تهيئة المتغير مع كائن المشيدة حديثا:

()deadline = new Date

أو يمكنك تعيين المتغير تشير إلى كائن موجود:

deadline = birthday

الآن كل المتغيرات تشير إلى نفس الكائن.
من المهم أن ندرك أن متغير كائن في الواقع لا تحتوي على كائن. أنه يشير فقط إلى كائن. في جافا قيمة أي متغير كائن مرجع إلى الكائن يتم تخزينها في أماكن أخرى. قيمة الإرجاع من المشغل الجديد أيضا مرجع. بيان مثل:

()Date deadline = new Date

يتكون من جزأين. التعبير "()new Date"يجعل كائن نوع تاريخ، وقيمته مرجع إلى كائن تم إنشاؤه حديثا. أن المرجع ثم تخزينها في المتغير "deadline". يمكنك صراحة تعيين متغير كائن إلى فارغة للإشارة إلى أنها حاليا تشير إلى لا كائن.

deadline = null


(if (deadline != null

(System.out.println(deadline


إذا قمت بتطبيق أسلوب لمتغير يحتوي على null ثم يحدث خطأ وقت تشغيل.

birthday = null


String s = birthday.toString(); // runtime error
اذ لم يتم تلقائياً تهيئة المتغيرات إلى null يجب تهيئة لهم أما عن طريق استدعاء جديدة أو بإعداد منهم إلى null.

  • ملاحظة ++C : يعتقد كثير من الناس عن طريق الخطأ أن متغيرات كائن Java تتصرف مثل المراجع ++C.


ولكن في C++لا يوجد أي إشارات لاغية ولا يمكن تعيين المراجع. وينبغي أن تفكر في متغيرات الكائن Java مماثلة للكائن المؤشرات في c فعلى سبيل المثال:
Date birthday; // Java هو في الحقيقة نفس:
++Date* birthday; // C
بمجرد إجراء هذه الرابطة كل شيء يقع في مكانة. بالطبع ليس تهيئة مؤشر تاريخ حتى تقوم بتهيئته مع مكالمة جديدة. بناء الجملة هو نفسه تقريبا في Java و ++c.
++Date* birthday = new Date(); // C
إذا قمت بنسخ متغير واحد إلى آخر ثم كلا المتغيرات تشير إلى نفس التاريخ – فهي المؤشرات إلى الكائن نفسه. ما يعادل مرجع null جافا هو مؤشر NULL في ++C. في جافا جميع الكائنات الحية في كومة الذاكرة المؤقتة. عندما يتضمن كائن متغير كائن آخر لا يزال هذا المتغير يحتوي على مجرد مؤشر إلى كائن آخر في كومة الذاكرة المؤقتة. في مؤشرات C تجعلك عصبيا لأنهم عرضه لذلك الخطأ. فمن السهل إنشاء مؤشرات سيئة أو خطاء في إدارة الذاكرة. في جافا هذه المشاكل ببساطة الذهاب بعيداً. إذا قمت باستخدام مؤشر غير مهيأ نظام وقت التشغيل موثوق سيقوم بإنشاء خطأ وقت تشغيل بدلاً من إنتاج نتائج عشوائية. كنت لا تقلق بشأن إدارة الذاكرة لأن يعتني أنه جامع البيانات المهملة.
++C يجعل محاولة مع دعمها لمنشئات نسخ ومشغلي الإحالة السماح بتنفيذ الأشياء التي تنسخ نفسها تلقائياً. فعلى سبيل المثال نسخة قائمة مرتبطة قائمة جديدة مرتبطة مع محتويات ذاته، لكن مع مجموعة مستقلة من الروابط. و هذا يجعل من الممكن لفئات التصميم مع نسخة نفس السلوك كالأنواع المضمنة. في جافا يجب استخدام أسلوب الاستنساخ للحصول على نسخة كاملة من المتغير.
فئة التقويم الميلادي لمكتبة جافا:
في الأمثلة السابقة قمنا باستخدام فئة التاريخ الذي جزء من مكتبة جافا القياسية. له مثيل من فئة تاريخ دولة هي نقطة معينة في الوقت. على الرغم من أن لا تحتاج إلى معرفة هذا عند استخدام فئة التاريخ والوقت يمثل عدد المللي ثانية(إيجابية أو سلبية ) من نقطة ثابتة الذي يعد 00:00:00 بالتَّوْقِيت الْعَالَمِيّ، يناير 1970. التوقيت العالمي (UTS) هو التوقيت العالمي الساعة العلمية القياسية التي هي للأغراض العملية نفسها، و على دراية (GMT)أو توقيت غرينتش.
ولكن كما تبين تاريخ الطبقة ليست مفيدة للغاية للتعامل مع التواريخ. مصمموا مكتبة جافا اتخاذ وجهة نظر أن وصف تاريخ مثل:
"ديسمبر31، 1999، 23:59:59 " هي اتفاقية التعسفية، تحكمها التقويم. ويتبع هذا الوصف خاصة التقويم الميلادي وهو التقويم يستخدم في معظم الأماكن في العالم.
أن وصف نفس النقطة في الوقت المناسب بشكل مختلف تماما في التقاويم القمرية الصينية أو العبرية ناهيك عن التقويم المستخدمة من قبل العملاء من المريخ. مصمم المكتبة قرر فصل الشواغل لحفظ الوقت وإرفاق أسماء للنقاط في الوقت المناسب. ولذلك يحتوي مكتبة جافا القياسية على فئتين منفصلتين فئة التاريخ الذي يمثل نقطة في الوقت، وفئة التقويم الميلادي الذي يعبر عن التواريخ في تدوين التقويم المألوفة. وفي الواقع يمتد فئة التقويم الميلادي فئة تقويم عامة أكثر التي تصف خصائص التقويمات بشكل عام. من الناحية النظرية يمكن توسيع الفئة التقويم وتنفيذ التقويم القمري الصيني أو تقويم المريخ. لكن المكتبة القياسية لا يتضمن أي تطبيقات التقويم إلى جانب التقويم الميلادي.
فصل قياس الوقت من التقويمات حسن تصميم وجوه المنحى. بشكل عام أنها لفكرة جيدة استخدام فئات منفصلة للتعبير عن مفاهيم مختلفة. فئة تاريخ قد سوى عدد قليل من الطرق التي تسمح لك بالمقارنة بين نقطتين في الوقت المناسب. على سبيل المثال، أساليب القبل والبعد تقول لكم إذا كان يأتي نقطة واحدة في الوقت قبل أو بعد آخر:
((if (today.before(birthday

("System.out.println("Still time to shop for a gift


وقد فئة التقويم الميلادي العديد من أساليب أكثر من تاريخ الطبقة. وبالخصوص فقد عدة منشئات مفيدة. التعبير:

()new GregorianCalendar


يبني كائن جديد يمثل التاريخ والوقت الذي شيد الكائن. يمكنك إنشاء كائن تقويم لمنتصف الليل في تاريخ محدد بتزويد السنة شهر ويوم: (new GregorianCalendar(1999, 11, 31 ومن الغريب إلى حد ما تحسب الأشهر من 0. ولذلك 11 هو كانون الأول/ديسمبر. لمزيد من الوضوح وهناك ثوابت مثلCalender.DECEMBER : (new GregorianCalendar(1999, Calendar.DECEMBER, 31
يمكنك أيضا تعيين الوقت: (new GregorianCalendar(1999, Calendar.DECEMBER, 31, 23, 59, 59 وبطبيعة الحال سوف تحتاج عادة لتخزين كائن مشيد في متغير:

(....)GregorianCalendar deadline = new GregorianCalendar

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

طرق الاسترجاع Mutator and Accessor Methods

في هذه النقطة ربما كنت تتتسائل: كيف يمكنني تحديد اليوم الحالي أو الشهر أو السنه لكائن التاريخ ميلادي معين ؟ وكيف يمكنني تغير القيم إذا غير راضي معهم؟ يمكن التعرف على طريقه تنفيذ هذه المهام من خلال النظر إلى الوثائق الفوريه أو ملاحظات API في نهايه هذا القسم سوف نتطرق إلى أهم الاساليب في نهايه هذا القسم.
وظيفه التقويم هي حساب السمات مثل التاريخ، يوم من ايام الاسبوع أو الشهر أو السنه، في وقت معين. للاستعلام عن واحد من هذه الاعدادات، يمكنك استخدام طريقه الاسترجاع (get) على فئه التقويم الميلادي. لتحديد العنصر الذي تريد استرجاعه يمكنك تمرير الثابت المعرف في فئه التقويم مثل Calendar.MONTH أو Calendar.DAY_OF_WEEK:

()GregorianCalendar now = new GregorianCalendar
(int month = now.get(Calendar.MONTH
(int weekday = now.get(Calendar.DAY_OF_WEEK


ملاحظات ال API تسرد كل الثوابت التي يمكن استخدامها. يمكنك تغير مع استدعاء طريقه التعيين (set):

(deadline.set(Calendar.YEAR, 2001
(deadline.set(Calendar.MONTH, Calendar.APRIL
(deadline.set(Calendar.DAY_OF_MONTH, 15


وهناك أيضا طريقة أسهل لضبط السنة والشهر واليوم ومع استدعاء واحد لطريقه التعين (set):

(deadline.set(2001, Calendar.APRIL, 15


وأخيرا، يمكنك الإضافة(add) عدة أيام أو أسابيع أو أشهر، وغيرها، إلى كائن التقويم:
deadline.add(Calendar.MONTH, 3); // move deadline by 3 months
إذا قمت بإضافة رقم سالب، سينتقل التقويم الوراء.

هناك فرق بين مفهومي طريقة الحصول (get) من جهة والإضافة(add) و طريقه الاستعلام (set) من ناحية أخرى. طريقة الحصول (get) يقوم فقط بالبحث عن حالة الكائن واحضاره. اما طريقه الاستعلام (set) والإضافة (add) تقومان بالتعديل حالة الكائن.الأساليب أو الطرق التي تغير بناءً على طلب الحقول تسمى بأساليب التغير (mutator)، وتلك التي فقط تتمكن من الوصول إلى الحقول بناءً على الطلب دون تعديل تسمى بطرق الاسترجاع(accessor). والمتفق أو المتعارف عليه هوالطريقه التي تسمى بطرق الأسترجاع مع (get)، وأساليب التغيير مع (set). على سبيل المثال، فإن فئه التقويم الميلادي (GregorianCalendar) تحتوي على getTime وsetTime التي تسترجع وتعيين الوقت الذي يمثل كائن التقويم:

()Date time = calendar.getTime
(calendar.setTime(time


هذه الطرق مفيدة بشكل خاص لتحويل بين التقويم الميلادي و فئه التاريخ. هنا مثال على ذلك. لنفرض أنك تعرف السنة والشهر واليوم و تريد أن تجعل من كائن التاريخ مع هذه الإعدادات. لأن فئه التاريخ لا يعرف شيئاً عن التقويم أولا بناء على كائن التقويم الميلادي(GregorianCalendar) ثم استدعاء طريقة (getTime) للحصول على تاريخ:

(GregorianCalendar calendar = new GregorianCalendar(year, month, day
()Date hireDay = calendar.getTime


على العكس من ذلك، إذا كنت تريد أن تجد السنة أو الشهر أو اليوم لكائن التاريخ، كنت بناء كائن التقويم الميلادي (GregorianCalendar)، ضبط الوقت، ومن ثم استدعاء طريقه الاسترجاع(get):
()GregorianCalendar calendar = new GregorianCalendar
(calendar.setTime(hireDay
(int year = calendar.get(Calendar.YEAR
ننتهي من هذا الباب مع البرنامج الذي يضع فئة التقويم الميلادي (GregorianCalendar) للعمل. يعرض برنامج تقويم للشهر الحالي، مثل هذا:
عرض برنامج تقويم للشهر الحالي
يتم وضع علامة على اليوم الحالي أو المحدد بعلامة النجمة (*). كما ترون، يحتاج البرنامج إلى معرفة كيفية حساب طول الشهر وأيام الأسبوع من يوم معين.

()GregorianCalendar d = new GregorianCalendar

لكي نحصي اليوم الحالي والشهر بواسطة استدعاء طريقة الاسترجاع (get) مرتين.

(int today = d.get(Calendar.DAY_OF_MONTH
(int month = d.get(Calendar.MONTH


ثم نستخدم طريقه الاستعلام (d (set للشهر الأول من واستخدام طريقه الحصول (get) على أيام الأسبوع من ذلك التاريخ.

(d.set(Calendar.DAY_OF_MONTH, 1
(int weekday = d.get(Calendar.DAY_OF_WEEK


متغير أيام الأسبوع تحدد لCalendar.SUNDAY إذا كان اليوم الأول من الشهر هو الأحد، إلى Calendar.MONDAY إذا كان يوم الاثنين، إلى اخره. (وهذه القيم هي في الواقع اعداد صحيحة 1، 2،...، 7)، ولكن من الأفضل عدم كتابة التعليمات البرمجية التي تعتمد على تلك المعلومه.

  • لاحظ أن السطر الأول من التقويم متساوي الأطراف، حتى أن اليوم الأول من الشهر يقع على يوم الأسبوع المناسب.
  • هذه الطريقة صعبه بعض الشيء اعراف مختلفه تخص اليوم الأول في الاسبوع. في الولايات المتحدة، يبدأ الأسبوع بالاحد وينتهي بالسبت في حين أنه في أوروبا، يبدأ الأسبوع بالاثنين وينتهي بالاحد.

آلة الجافا الافتراضية JVM تدرك لغة المستخدم الحالي. (locale) يصف تنسيق الاعراف المحلية، بما فيها بداية الأسبوع وأسماء أيام الأسبوع. (getFirstDayOfWeek) تستخدم للحصول على اليوم الأول من ايام الاسبوع في مكان محدد. لتحديد تفصيل البداية المطلوبة، طرحنا 1 من اليوم من كائن التقويم حتى نصل إلى اليوم الأول من الأسبوع.

()int firstDayOfWeek = d.getFirstDayOfWeek
int indent = 0


(while (weekday != firstDayOfWeek
}

++indent
(d.add(Calendar.DAY_OF_MONTH, -1)
(weekday = d.get(Calendar.DAY_OF_WEEK


{

تعريف الفئة الخاصه بك

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

فئة اسم الفئة
}

البناء1

البناء2

...

الطريقة 1

الطريقة 2

...

الحقل1

الحقل2

{

  • ملاحظة: نعتمد على النمط الذي طرق الفئة تأتي أولا والحقول تأتي في نهاية المطاف. ولعل هذا بطريقة صغيرة، تشجع، فكرة النظر إلى الواجهة أولا، وإيلاء اهتمام أقل لتنفيذ.

مراعاة ما يلي، مبسطة جدا، نسخة من فئة الموظفين التي يمكن استخدامها من قبل رجال الأعمال في كتابة نظام الرواتب.

class Employee

{

// constructor
(public Employee(String n, double s, int year, int month, int day
{

name = n
salary = s
(GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day
()hireDay = calendar.getTime


}
// a method
()public String getName
{

return name


} // more methods
. . .
// instance fields

private String name
private double salary
private Date hireDay

}
نحن كسرنا تنفيذ هذه الفئة بشيء من التفصيل في الأقسام التالية. أولا، على الرغم من قائمة 4-2 يوضح البرنامج الذي يدل على فئة الموظف في العمل. في هذا البرنامج، ونحن بنينا مجموعة الموظف وملئناه مع ثلاثة أشياء:

[Employee[] staff = new Employee[3
("...,staff[0] = new Employee("Carl Cracker
("...,staff[1] = new Employee("Harry Hacker


("...,staff[2] = new Employee("Tony Tester


التالي، ونحن نستخدم طريقة raiseSalary من فئة الموظف لزيادة الراتب لكل موظف بنسبة 5٪:
(for (Employee e : staff

(e.raiseSalary(5


وأخيرا، فإننا طبعنا معلومات حول كل موظف، عن طريق استدعاء أساليب getName، getSalary، وgetHireDay:
(for (Employee e : staff
()System.out.println("name=" + e.getName

()salary=" + e.getSalary,"+
(()hireDay=" + e.getHireDay,"+


لاحظ أن مثال البرنامج يتكون من فئتين: فئة الموظف وEmployeeTest الفئة مع محدد وصول الجمهور. ويرد الطريقة الرئيسية للتعليمات التي وصفناها للتو في EmployeeTest الصف.
اسم مصدر الملف EmployeeTest.java لأن اسم الملف يجب أن يطابق اسم الفئة العامة. هل يمكن أن يكون فئة العمومي واحد فقط في مصدر الملف، ولكن هل يمكن أن يكون أي عدد من الطبقات غير عامة.
بعد ذلك، عند تجميع شفرة هذه المصدر، يقوم المترجم بإنشاء ملفات الطبقتين في الدليل: EmployeeTest.class وEmployee.class.
بدء تشغيل البرنامج عن طريق إعطاء المترجم بايت كود اسم الفئة التي تحتوي على الطريقة الرئيسية من البرنامج: جافا EmployeeTest المترجم بايت كود يبدأ تشغيل التعليمات البرمجية في الأسلوب الرئيسي في فئة EmployeeTest. هذا الرمز بدوره يبني ثلاثة أشياء الموظف الجديد ويظهر لك دولتهم.
EmployeeTest.java

1. ;*.import java.util
2.public class EmployeeTest
3. {
4. (public static void main(String[] args(public static void main(String[] args
5. {
6. // fill the staff array with three Employee objects
7. ;[Employee[] staff = new Employee[3
8. ;(staff[0] = new Employee("Carl Cracker", 75000, 1987, 12, 15
9. ;(staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1
10.;(staff[2] = new Employee("Tony Tester", 40000, 1990, 3, 15
11. // raise everyone's salary by 5%
12. (for (Employee e : staff
13. ;((e.raiseSalary(5)
14.// print out information about all Employee objects
15.(for (Employee e : staff
16. "=System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay
17. ;(()e.getHireDay+
18.}
19.}
20. class Employee
21. {
22.(public Employee(String n, double s, int year, int month, int day
23.{
24. ;name = n
25. ;salary = s
26. ;(GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day
27. // GregorianCalendar uses 0 for January
28. ;()hireDay = calendar.getTime
29. }
30. ()public String getName
31. {
32. ;return name
33. }
34. ()public double getSalary 35. { 36. ;return salary 37. } EmployeeTest.java
1. ()public Date getHireDay
2. {
3. ;return hireDay
4. }
5. (public void raiseSalary(double byPercent
6. {
7. ;double raise = salary * byPercent / 100
8. ;salary += raise
9. }
10. ;private String name
11. ;private double salary
12. ;private Date hireDay
13. }

  • استخدام ملفات المصدر المتعددة

البرنامج في قائمة 4-2 واثنين من الفئات في ملف مصدر واحد. العديد من المبرمجين يفضلون وضع كل فئة في الملف المصدر الخاص بها. على سبيل المثال، يمكنك وضع فئة الموظف في ملف Employee.java وEmployeeTest الصف إلى EmployeeTest.java. إذا كنت مثل هذا الترتيب، ثم لديك خياران لتجميع البرنامج. يمكنك استدعاء مترجم جافا مع البدل: JAVAC الموظف *. JAVA

ثم، سيتم تجميع كافة ملفات المصدر المطابقة للبدل في ملفات فئة. أو، يمكنك كتابة ببساطة JAVAC EmployeeTest.java قد تجد أنه من المستغرب أن الخيار الثاني يعمل على الرغم من أن ملف Employee.java أبدا جمعت صراحة. ومع ذلك، عندما يرى مترجم جافا فئة الموظف تستخدم داخل EmployeeTest.java، وسوف نبحث عن ملف اسمه Employee.class. إذا لم تجد هذا الملف، فإنه تلقائيا بالبحث عن Employee.java ثم يجمع عليه. حتى أكثر من ذلك هو الصحيح: إذا كان الطابع الزمني لإصدار Employee.java التي يجدها هو أحدث من ذلك الملف Employee.class القائمة، سوف مترجم جافا إعادة ترجمة الملف تلقائيا.

  • ملاحظة: إذا كنت معتادا على "جعل" مرفق من UNIX (أو أحد أبناء عمومة ويندوز لها مثل "NMAKE")، ثم يمكنك التفكير في مترجم جافا بما أن يتلقى وظيفة "جعل" بنيت بالفعل في.

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

(public Employee(String n, double s, int year, int month, int day
()public String getName
()public double getSalary
()public Date getHireDay
(public void raiseSalary(double byPercent
يتم تمييزها عن طرق هذه الفئة مثل الجمهور. الجمهور الكلمة يعني أن أي طريقة في أي فئة يمكن استدعاء الأسلوب. (وتغطي مستويات الوصول الأربع الممكنة في هذا المجال والفصل التالي). التالي، لاحظ أن ثلاثة حقول المثال سوف يعقد البيانات سنقوم التلاعب داخل مثيل فئة الموظف.

private String name
private double salary
private Date hireDay


الكلمة خاصة بالتأكد من أن الطرق الوحيدة التي يمكن الوصول إلى هذه الحقول على سبيل المثال هي طرق فئة الموظف نفسه. لا توجد طريقة الخارجي يستطيعون القراءة أو الكتابة إلى هذه المجالات.

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


وأخيرا، لاحظ أن اثنين من حقول سبيل المثال هم أنفسهم كائنات: الاسم والحقول hireDay إشارات إلى سلسلة وأشياء التسجيل. هذا هو المعتاد جدا: غالبا ما تحتوي على فصول المجالات مثيل نوع فئة.

الخطوة الإولى مع المشيد First Step with Constructors

دعونا ننظر إلى المشيد المدرج في فئة الموظف لدينا
(public Employee(String n, double s, int year, int month, int day
{

name = n
salary = s
(GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day
()hireDay = calendar.getTime

{
كما ترون، ان اسم المشيد هو نفس اسم الفئة . هذا المشيد يعمل عندما تشيد كائن من فئة الموظف على سبيل المثال، عند إنشاء مثيل فئة الموظف مع رمز مثل هذا:

( new Employee("James Bond", 100000, 1950, 1, 1

قمت بتعيين حقول المثيل على النحو التالي

"name = "James Bond
salary = 100000
hireDay = January 1, 1950

هناك فارق هام بين المشيدات وغيرها من الأساليب. لا يمكن أن ينادى المشيدالا بالتزامن مع المشغل الجديد(new). لا يمكنك تطبيق مشيد إلى كائن موجود لإعادة حقول المثيل.على سبيل المثال،

(james.Employee("James Bond", 250000, 1950, 1, 1


هو خطأ وقت التحويل البرمجي. إبقي التالي في عين الاعتبار:
• المشيد له نفس اسم الفئة.
• يمكن أن يكون هناك أكثر من مشيد واحد للفئة.
• يمكن للمشيد ان يكون له صفر، واحد، أو أكثر من المعلمات.
• المشيد ليس له قيمة استرجاع.
• ينادى المشيد دائما مع المشغل الجديد.(new)

معلمات الضمنية والصريحة


طرق تعمل على الكائنات والوصول إلى حقول المثيل بهم. على سبيل المثال،
(public void raiseSalary(double byPercent {

double raise = salary * byPercent / 100
salary += raise

}
طريقة raiseSalary له معلمتين. المعلم الأول، ويسمى معلم ضمني، هو كائن من نوع الموظف الذي يظهر قبل اسم الأسلوب. المعلم الثاني، داخل القوسين بعد اسم الأسلوب، هو معلم صريحة. كما ترون، يتم سرد المعلمات صريحة صراحة في اعلان الطريقة، على سبيل المثال، byPercent double . لا يظهر المعلم الضمني في اعلان الطريقة والكلمة this تشير إلى معلم ضمني. إذا أردت، يمكنك كتابة طريقة raiseSalary على النحو التالي: (public void raiseSalary(double byPercent {

double raise = this.salary * byPercent / 100
this.salary += raise

}

فوائد التغليف

( getName, getSalary, getHireDay )في النهاية فلنلق نظره عن قرب إلى الطرق البسيطه ()public String getName {

return name

} ()public double getSalary {

return salary

} ()public Date getHireDay {

return hireDay

}
هذه أمثلة واضحة على طرق استرجاع. لأنهم ببساطة إرجاع القيم على طلب الحقول، ويطلق عليه أحيانا استرجاع الحقول. لن يكون من السهل جعل الاسم، والراتب، اليوم على انها حقول عامه، بدلا من وجود طرق استرجاع منفصلة؟ وهذه النقطة تعني أن حقل الاسم هو حقل للقراءة فقط.بمجرد تعيينها في المنشئ، لا توجد طريقة لتغييره.وبالتالي، لدينا ضمان لحقل اسم لن يتلف ابدا. حقل الراتب ليس للقراءة فقط، ولكن يمكن أن يتغير عن طريق raiseSalary. على وجه اخص، يجب لا أن تكون القيمة من أي وقت مضى خطأ، فقط يحتاج لهذه الطريقة لتكون تصحيحه. ان حقل الراتب كان عام والسبب في فقد قيمة كان يمكن أن يكون في أي مكان. في بعض الأحيان، قد يحدث أن كنت ترغب في الحصول على قيمه اوتعيين قيمة حقل مقترح.
تحتاج إلى توفير ثلاثة بنود:
1-حقل البيانات الخاص
2- طريقة استرجاع الحقل العام
3- طريقه تعين الحقل العام
وهنالك ما هو أكثر من ذلك بكثير ولكن صعبه في توفير حقل بيانات عامة محدده، ولكن لها عدد كبير من الفوائد. أولا، يمكنك تغيير التطبيق الداخلي دون التأثير على أي رمز آخر من وأساليب الفئة. على سبيل المثال، إذا تم تغيير تخزين اسم

String firstName
String lastName

ثم يمكن تغيير طريقة getName للعودة firstName + " " + lastName هذا التغيير غير مرئي تماما فيما يتعلق ببقية البرنامج.

امتيازات الوصول على أساس الفئة


أنت تعلم أنه يمكن للطرق الوصول إلى البيانات الخاصة للكائن الذي تم استدعائه. من المستغرب ان يجد كثير من الناس أن الطريقة يمكنها الوصول إلى البيانات الخاصة بجميع كائنات من فئتها. على سبيل المثال، الطريقة equals الأسلوب الذي يقارن بين الموظفين class Employee { . . . (boolean equals(Employee other {

(return name.equals(other.name

} } A typical call is ......((if (harry.equals(boss
هذه الطريقة تسمح بالوصول إلى حقول خاصة لهاري(harry)، الذي ليس من المستغرب. فإنه يصل أيضا إلى حقول خاصة من رب العمل(boss). هذا قانوني لأن رئيسه (boss)هو كائن من نوع الموظف، وطريقة لفئة الموظف تسمح للوصول إلى حقول خاصة من أي كائن من نوع الموظف.

طرق خاصة

عند تنفيذ فئة، نحن نجعل كل مجالات البيانات خاصة لأن البيانات العامة خطرة. ولكن ماذا عن الطرق؟ في حين أن معظم الطرق العامة فان الطرق الخاصة تستخدم في ظروف معينة. في بعض الأحيان، قد ترغب في تفريق رمز طرق منفصلة مساعدة. عادة، هذا المساعد لا ينبغي أن يصبح جزءا من واجهة المستخدم قد تكون قريبة جدا ل التنفيذ الحالي أو يتطلب بروتوكول خاص أو أمر الاستدعاء. فان أفضل طريقة لتنفيذه هو اعطائه طابع الخصوصية. لتنفيذ طابع الخصوصية للطرق فقط قم بتبديل كلمة public إلى كلمة private .

حقول المثيل النهائي

يمكنك تحديد حقل المثيل كنهائي. يجب تهيئة مثل هذا الحقل عند الكائن التي شيدت. وهذا يعني أنه يجب ضمان أنه تم تعيين قيمة الحقل بعد نهاية كل المشيد بعد ذلك، ليس هناك مجال للتعديل مرة أخرى على سبيل المثال، حقل اسم فئة الموظف قد أعلن أنه نهائي لأنه لا يتغير بعد ان تم تشييد الكائن - لا يوجد هناك طريقة setName. class Employee { . . .

private final String name

}

الحقول و الطرق الساكنة

  • الحقول الساكنة: إذا قمت بتعريف الحقل كحقل ساكن، فسوف يكون هناك فقط حقل واحد في الفئة الواحدة. في المقابل، كل

كائن له نسخته من كافة حقول المثيل. على سبيل المثال، لنفترض أننا نريد تخصيص رقم تعريف فريد لكل موظف. نضيف حقل مثيل id و nextId حقل ثابت إلى فئة الموظف: class Employee { . . .

private int id
private static int nextId = 1

}

  • الثوابت الثابتة: متغيرات الثابتة نادرة جدا. ومع ذلك، فان الثوابت الثابتة هي أكثر شيوعا. على سبيل المثال، فئة الرياضيات تعرف ثابت ثابت:

public class Math { . . .

public static final double PI = 3.1415926535897932384;

. . . } يمكنك الوصول إلى هذا الثابت في البرامج الخاصة بك كما Math.PI. إذا كان قد تم حذف الكلمة static، ثم PI كان يمكن أن يكون حقل مثيل في فئة الرياضيات. فسوف تكون في حاجة إلى كائن من فئة الرياضيات للوصول إلى PI، وكل كائن من فئة الرياضيات يجب ان يكون له نسخته من PI.

  • الطرق الساكنة: الطرق الساكنة هي الطرق التي لا تعمل على الكائنات. على سبيل المثال، وطريقة pow من فئة الرياضيات هو أسلوب ثابت. Math.pow(x, a)

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

  1. عندما لا تحتاج إلى طريقة للوصول إلى حالة الكائن لأن كل الحاجة يتم تزويدها كمعلمات صريحة (على سبيل المثال: Math.pow)
  2. عندما نحتاج الطريقة فقط للوصول إلى حقول ثابتة من فئة (على سبيل المثال:

Employee.getNextId)

طريقة main

لاحظ أنه يمكنك استدعاء اساليب ساكنة من دون أي الكائنات. على سبيل المثال، أبدا لا تشييد أي كائنات من فئة الرياضيات للاتصال ب Math.pow. لنفس السبب، طريقة main هو اسلوب ساكن. public class Application { (public static void main(String[] args { // construct objects here . . . } } الطريقة main لا تعمل على أي الكائنات. في الواقع، عندما يبدأ البرنامج، ليست هناك أي كائنات حتى الان. ينفذ static main، ويبني الكائنات التي يحتاج اليها البرنامج.

تشييد الكائن

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

الحمولة الزائدة

تذكر بان فئة GregorianCalendar لها أكثر من مشيد فبامكتننا استخدام احداهما:

()GregorianCalendar today = new GregorianCalendar

or

(GregorianCalendar deadline = new GregorianCalendar(2099, Calendar.DECEMBER, 31

وهذا ما يسمى بقدرة الحمولة الزائدة. يحدث الحمل الزائد إذا كانت هناك عدة طرق لديها نفس الاسم. ولكن بمعلمات مختلفة. يجب على المترجم فرز الطريقة التي يجب الاتصال بها. فإنه يأخذ الطريقة الصحيحة من قبل مطابقة أنواع المعلمة في رؤوس من الطرق المختلفة مع أنواع القيم المستخدمة في استدعاء طريق المحدد. يحدث خطأ وقت الترجمة إذا كان المترجم لا يمكن أن يتطابق مع المعلمات أو إذا كان هناك أكثر من تطابق ممكن.

تهيئة الحقل افتراضيا

إذا لم تقم بتعيين حقل صريح في مشيد، يتم تعيينها تلقائيا إلى افتراضي القيمة: الأرقام إلى 0، القيم المنطقية إلى false، ومراجع الكائن إلى null. ولكنه يعتبر ممارسة البرمجة الفقيرة إلى الاعتماد على هذا. بالتأكيد، فإنه يجعل من الصعب على أي شخص لفهم التعليمات البرمجية الخاصة بك إذا كان يتم تهيئة حقول بخفاء. على سبيل المثال، انظر في فئة الموظف. لنفترض أنك لم تحدد كيفية تهيئة بعض الحقول في المشيد. افتراضيا، سيتم تهيئة الميدان مع راتب 0 وسيتم تهيئة اسم وحقل hireDay مع null. ومع ذلك، فإن ذلك لا يكون فكرة جيدة. إذا كان أي شخص نادى الطريقة getName أو getHireDay سوف يحصل على مرجع فارغ لا يتوقعونه.

()Date h = harry.getHireDay

calendar.setTime(h); // throws exception if h is null

المشيد الافتراضي

المشيد الافتراضي هو المشيد بدون أي معلم. على سبيل المثال، هنا هو المشيد الافتراضي لفئة الموظف: ()public Employee {

""=name
salary = 0
()hireDay = new Date

} إذا كتبت فئة مع عدم وجود مشيد على الإطلاق، يتم توفير مشيد افتراضي لك. هذا المشيد الافتراضي يحدد كافة حقول المثيل إلى قيمها الافتراضية. لذلك، فإن كل البيانات الرقمية الواردة في مجالات المثيل تكون 0، و كل القيم المنطقية إلى false، وسيتم تعيين كافة متغيرات الكائن إلى قيمة null.

تهيئة الحقول الصريحة

لأنك يمكن أن تفرط في طرق تشييد الفئة ، فمن الواضح يمكنك تشييد طرق عديدة لضبط الحالة الأولية من الحقول مثيل للفئات. هو دائما فكرة جيدة للتأكد من ذلك، بغض النظر عن مناداة المشيد، يتم تعيين كل حقل مثيل إلى شيء مفيد. يمكنك ببساطة تعيين القيمة إلى أي حقل في تعريف الفئة. class Employee { . . .

""=private String name

} ويتم هذا التعيين من قبل تنفيذ المشيد هذه الجملة مفيدة بشكل خاص إذا كانت جميع المشيدات من فئة تحتاج إلى تعيين حقل المثيل خاصا لنفس القيمة. ليس من الضروري ان تكون قيمة التهيئة قيمة ثابتة. هنا هو مثال الذي يتم تهيئة حقل مع استدعاء أسلوب. انظر في فئة الموظف حيث لكل موظف حقل id. class Employee { . . . ()static int assignId {

int r = nextId
++nextId
return r

} . . .

()private int id = assignId

}

أسماء المعلمات

عند كتابة مشيدات تافهة جدا يمكن أن يكون من المحبط بعض الشيء التوصل إلى أسماء المعلمات. فلقد قمنا باختيار أسماء المعلمات ذو حرف واحد: (public Employee(String n, double s {

name = n
salary = s

} فإن العيب في ذلك هو أنك ستحتاج إلى قراءة رمز لمعرفة ما تعني المعلمات n و s. بعض المبرمجين يبدأون كل معلمة مع "a" (public Employee(String aName, double aSalary {

name = aName
salary = aSalary

} تعتمد آخر خدعة شائعة الاستخدام على حقيقة أن المتغيرات المعلمة ظل حقول المثيل بنفس الاسم. على سبيل المثال، في حالة استدعاء المعلم salary، بحيث يشير إلى المعلم، ليس إلى حقل المثيل. لكن لا يزال بإمكانك الوصول إلى حقل المثيل كما this.salary. أذكر أن هذا يدل على معلم ضمني، أي الكائن الذي يتم بناؤه. (public Employee(String name, double salary {

this.name = name
this.salary = salary

}

استدعاء مشيد آخر

وهذا يشير إلى المعلمة الضمنية لأسلوب الكلمة الأساسية. ولكن الكلمة لها معنى اخرى. إذا كان البيان الأول من مشيد النموذج هذا(...)، ثم استدعاء المشيد مشيد آخر من نفس الفئة. هنا مثال نموذجي: (public Employee(double s { (calls Employee(String, double//

(this("Employee #" + nextId, s
++nextId

} عند استدعاء "(new Employee(60000" بعدها ال" (Employee(Double" المشيد يستدعي مشيد "(Employee (String, Double" . باستخدام هذه الكلمة الرئيسية في هذه الطريقة مفيدة ،فقط تحتاج إلى كتابة رمز البناء المشترك مرة واحدة.

تهيئة الكتل


بالفعل رأيتم طريقتين لتهيئة حقل البيانات:
- عن طريق تعيين قيمة في البناء.
-بواسطة تعيين قيمة في الإعلان.
في الواقع هناك الثالثة آلية في جافا. انها تدعى بتهيئة الكتل. يمكن للفئات أن تحتوي على تعريفات كتل التعسفي من التعليمات البرمجية. يتم تنفيذ هذه الكتل عندما يتم إنشاء كائن من هذه الفئة. فعلى سبيل المثال:
class Employee { (public Employee(String n, double s {

name = n
salary = s

} ()public Employee {

""=name
salary = 0

} . . .

private static int nextId
private int id
private String name
private double salary

. . . object initialization block { //

id = nextId
++nextId

} } في هذا المثال هو تهيئة حقل معرف في كتلة تهيئة كائن بغض النظر عن الذي يستخدم مشيد إنشاء كائن. يتم تشغيل تهيئة الكتلة أولا وثم يتم تنفيذ نص المنشئ. هذه الآلية غير لازمة وليست شائعة. فإنه عادة ما يكون أكثر وضوحا لوضع رمز التهيئة داخل مشيد. هناك الكثير من السبل لتهيئة حقول البيانات، حيث انه يمكن أن يكون مربكاً جداً في إعطاء جميع المسارات الممكنة لعملية البناء،
وهنا ماذا سيحدث بالتفصيل عندما يتم استدعاء مشيد:
1- يتم تهيئة كافة حقول البيانات إلى قيمتها الافتراضية (0, false, or null).
2- يتم تنفيذ جميع الميدان وكتل التهيئة، في الترتيب الذي تحدث في تعريف فئة.
3-إذا كان السطر الأول من مشيد يدعو مشيد الثاني، ثم يتم تنفيذ مشيد الثاني.
4- ينفذ جسم المشيد.
وبطبيعة الحال، أنها دائماً فكرة جيدة لتنظيم التعليمات البرمجية التهيئة حيث أن مبرمج آخر يمكنه أن يفهم بسهولة دون الحاجة إلى أن يكون محام اللغة. على سبيل المثال سيكون من الغريب جداً، وإلى حد ما خطأ عرضه ليكون فئة المشيدات التي تعتمد على ترتيب فيه يتم تعريف حقول البيانات. يمكنك تهيئة حقل ثابت أما بتوفير قيمة أولية أو باستخدام كتلة تهيئة ثابتة. لقد رأيت بالفعل أول آليه. ;" static int nextId =" 1 إذا كانت الحقول الثابتة من الفئة الخاصة بك تتطلب تعقيداً استخدام رمز التهيئة كتلة تهيئة ثابتة. ضع التعليمات البرمجية داخل كتلة وعلامة عليه مع الكلمة الأساسية ثابتة. هنا مثال على ذلك. نريد أرقام معرف الموظف البدء في عدد صحيح عشوائي أقل من 10000 .

static initialization block static // {

()Random generator = new Random
(nextId = generator.nextInt(10000

}

التهيئة الثابتة يحدث عندما يتم أولاً تحميل الفئة. المثال مثل حقول حقول ثابتة هي "0, false, null" إلا إذا كنت صراحة تعيينها إلى قيمة أخرى. يتم تنفيذ كافة مهيآت الحقل ثابتة وكتل التهيئة ثابتة في الترتيب الذي تحدث فيه تعريف الفئات.

مقالات ذات صلة



المراجع

1.^ Horstmann, Cay S., 1959- Core Java Volume 1 Fundamentals 8th edition

موسوعات ذات صلة :