الفئات والكائنات في لغة الجافا
هو حجر الزاوية في لغة الجافا حيث تعتبر الفئات الوحدات الأساسية في لغة البرمجة الكائنية نظرا لما تحتويه Classes الفئات من كائنات و طرق وبيانات.
الفئة هي القالب البرمجي للغة الجافا الذي يحدد شكل الكائنات لما تحتويه من بيانات و معاملات والكائن ينتمي للفئه وليس العكس
وبالتالي للفئة عناصر منها المتغيرات و النهج (الدوال –الطرق)
إذا الفئه هي كالمستودع الذي يستطيع المبرمجون ان يجمعوا فيه البيانات و الطرق ( الدوال) تحت سقف واحد.
يتم إنشاء الفئات بإستخدام الكلمة المفتاحية class وهي من الكلمات المحجوزة في الجافا ويكون الشكل العام للفئة كما يلي :
هذا اذا كان برنامجنا يحتوي على عدة فئات مجتمعه في ملف واحد وبالتالي فإن الفئة الرئيسية التي تحتوي على الدالة Main تبدأ 
بمحدد الوصول Public class أي أن الفئة عامة, وتبدأ جميع الفئات الأخرى بالكلمه المحجوزه Class كما في الصوره السابقه
أما اذا كان برنامجنا يحتوي على عدة فئات كلا في ملف منفصل فلابد من كل الفئات ان تبدأ Public class
ويجب أن تحتوي اي فئة على دالة واحده متغير واحد على الاقل او كلاهما وحين نريد أن نصمم فئة يجب أن نراعي نوع البيانات ومدى موافقتها معا داخل الفئة بمعنى لو كانت الفئة مثلا مصممه لتخزين أسماء موظفين وأرقام هواتفهم وعناوينهم لن يكون مناسب أن أضع بنفس الفئة بيانات عن حالة الطقس وحالة البحر ومعدل سقوط الأمطار , ولذلك يجب أن نراعي الناحية المنطقية عند تصميم الفئة من حيث علاقة البيانات التي نريد التعامل معها في نفس الفئة.
هي المفتاح لمفهوم البرمجة كائنة التوجه
تعتبر الكائنات البرمجية مشابهة للكائنات الحقيقية من حيث المبدأ: كلاهما يتجلى في حالة وسلوكات. الكائن يخزن حالته في حقول (fields) 
(تسمى متغيرات في لغات برمجية أخرى) ويعرض تصرفاته من خلال طرق (methods) تسمى دوال (functions) في لغات برمجية أخرى. الطرق تعمل على الحالة الخاصة بالكائنات، وتشكل الآلية الأساسية للتواصل بين الكائنات. إخفاء الحالة واشتراط أن يكون كل تفاعل مع الكائن يمر عبر الطرق الخاصة به، يعرف ب تغليف البيانات (Data encapsulation)، وهو مبدأ أساسي في البرمجة الكائنية التوجه.
لنأخذ الدراجة كمثال:
عندما نحدد الحالة (السرعة الحالية، الإيقاع الحالي للدواسة، الدولاب الحالي) ونوفر الطرف التي تستطيع تغيير هذه الحالة، فإن الكائن يبقى متحكما في الطريقة المتاحة لاستعماله من أي عنصر خارجي. مثلا، إذا كانت الدراجة تتوفر فقط على 6 دواليب، فإن الطريقة التي تقوم بتغيير الدولاب يمكنها أن ترفض أي قيمة أصغر من 1 وأكبر من 6.
من أشهر العلاقات بين الفئات هي :
-الإعتماد "يستخدم-واحد" (uses–a).
-التجميع "تمتلك –واحد" ( has–a).
-الميراث "هو –واحد" (is–a).
هي من أكثر العلاقات وضوحاً والأكثر عموماً.على سبيل المثال فئة الطلب تستخدم فئة الحساب بسبب ان كائنات الطلب تحتاج كائنات الحساب للتحقق من وضع الائتماني.لكن فئة السلعة لاتعتمد على فئة الحساب بسبب ان كائنات السلعة لاتحتاج ابدا للقلق حول حسابات العملاء . وهكذا، تعني هي فئة تعتمد على فئة أخرى إذاً هي تستخدم وسائلها أو تتعامل مع الأشياء من تلك الفئة.
في محاولة لتقليل الفئات التي تعمد على بعضها البعض وهذه النقطه هي إذا كانت فئة (أ)تجهل وجود فئة (ب)إذاً فئة (أ) هي غير مهتمة بأي تغير يحصل في فئة (ب)وهذا يعني (أي تغير يحصل في فئة(ب) لاتسبب الخلل في فئة (أ)) في مصطلحات هندسة البرمجيات نحتاج للتقليل بين اقتران الفئات .
هي علاقة سهلة الفهم لانها علاقة ملموسه .على سبيل المثال كائن الطلب يحتوي على كائنات السلعة .
الإحتواء يعني أن الكائنات من الفئة (أ) تحتوي على كائنات من الفئة (ب).
يعبر عن العلاقة بين فئة أكثر خصوصية وفئة أكثر عموميه . على سبيل المثال فئة الطلب المستعجل ترث من فئة الطلب ,فئة اللطلب المستعجل المتخصصه لها طرق خاصه للتعامل مع الاولويات وطريقة مختلفه لحساب رسوم الشحن ,ولكن اساليب اخرى مثل اضافة السلع والفواتير هي موروثة من فئة الطلب .بشكل عام اذا فئة (أ)امتداد فئة (ب) اذاًفئة (أ)ترث الاساليب من فئة (ب)ولكن لها المزيد من الميزات .
العديد من المبرمجين يستخدمون ترميز لغة النمذجة الموحده (UML) لرسم مخططات الفئة التي تصف العلاقات بين الفئات.على سبيل المثال في الرسم البياني للفئات يتم رسم الفئات على شكل مستطيلات ورسم العلاقات على شكل اسهم مع مختلف اشكالها الجدول السابق يوضع أهم الاشكال.
لايمكن القيام باي شيء في الجافا من دون استخدام الفئات, وانت بالفعل رأيت العديد من الفئات او تعاملت معها أثناء عملك .ومع ذلك لم يظهر لك جميع الميزات النموذجيه او التقليديه لكائنات التوجه. 
على سبيل المثال ، فئة الرياضيات 'Math class' يمكن استخدام أساليب او طرق (method) لفئة الرياضيات، مثل Math.random،من دون الحاجة إلى معرفة كيف يتم تنفيذها, فقط ماتحتاج اليه هو معرفة الاسم والمعلمات (parameters) إن وجدت .
هذه هي نقطة الكبسلة او التغليف (encapsulation) وسوف تنطبق بشكل صحيح على جميع الفئات .
ولكن فئة الرياضيات تقوم بكبسلة الوظيفة فقط من دون الحاجه إلى اخفاء البيانات .بسبب عدم وجود بيانات .لذا لاداعي للقلق حول كيفية انشاء الكائنات وتهيئة نماذج حقولها.
للعمل مع كائنات يمكنك أولاً البناء عليها وتحديد حالتها الأولية. ثم قمت بتطبيق أساليب للكائنات.
في لغة البرمجة جافا، يمكنك استخدام منشئات لبناء الحالات الجديدة. المنشئ هو أسلوب خاص الذي يهدف إلى بناء وتهيئة الكائنات. دعونا نلقي نظرة على مثال. مكتبة جافا القياسية تحتوي على فئة التاريخ. الكائنات الخاصة بها تصف النقاط في الوقت المناسب مثل "كانون، ديسيمبر 31, 1999, 23:59:59 بِتَوْقِيت غْرِينِتْش".
تم تجهيز مصممي اللغة حقاً التنبؤ بهذه الأنواع من القضايا؟ إذا أنهم يقومون بعمل فقير اللغة يصبح مشوشا وغير سارة، ولكن المبرمج التعيس عاجزة عن القيام بأي شيء حيال ذلك. مع الفئات هو تفريغ مهمة تصميم لمصمم مكتبة. إذا كانت الفئة غير مثالية يمكن بسهولة كتابة المبرمجين الآخرين فئات الخاصة بهم لتحسين أو استبدال نظام الطبقات. لإثبات هذه النقطة "جافا" مكتبة التاريخ مشوش قليلاً، وتجري حاليا إعادة تصميم رئيسي يمكنك زيارة الرابط التالي: http://jcp.org/en/jsr/detail?id=310
المنشئات دائماً لها نفس الاسم كاسم الفئة. وهكذا يسمى المنشئ لفئة التاريخ تاريخ. لإنشاء كائن تاريخ يمكنك دمج المنشئ مع المشغل الجديد كما يلي:
()new Date
هذا التعبير يبني كائن جديد. تتم تهيئة الكائن إلى الوقت والتاريخ الحاليين. إذا كنت تريد، يمكن تمرير الكائن إلى أسلوب: 
وبدلاً من ذلك يمكنك تطبيق أسلوب للكائن الذي كنت شيدت فقط. أحد الأساليب لفئة التاريخ هو الأسلوب" toString". أن يستدعي اسلوب تمثيل سلسلة للتاريخ. هنا كيف أن تطبيق الأسلوب toString على كائن تاريخ المشيدة حديثا:
يتم استخدام الكائن شيدت مرة واحدة فقط في هذين المثلين. عادة سوف تحتاج إلى الصمود على الكائنات التي يمكنك بناء حيث أنه يمكنك يمكن الحفاظ على استخدامها. ببساطة يمكنك تخزين الكائن في متغير:
وهناك فارق هام بين الكائنات ومتغيرات الكائن. 
-فعلى سبيل المثال البيان:
Date desdline; // deadline doesn't refer to any object
تعريف كائن المتغير "deadline" يمكن أن تشير إلى كائنات نوع التاريخ. 
من المهم أن ندرك أن المتغير "deadline" هو ليس كائن، وفي الواقع لا بعد حتى يشير إلى كائن. لا يمكنك استخدام أي أساليب التاريخ على هذا المتغير في هذا الوقت. مثال:
s = deadline.toString(); // not yet
سوف يؤدي إلى خطأ في وقت التحويل البرمجي. يجب عليك أولاً أن تهيئة متغير "deadline" . 
لديك خيارين بالطبع يمكنك تهيئة المتغير مع كائن المشيدة حديثا:
أو يمكنك تعيين المتغير تشير إلى كائن موجود: 
الآن كل المتغيرات تشير إلى نفس الكائن. 
من المهم أن ندرك أن متغير كائن في الواقع لا تحتوي على كائن. أنه يشير فقط إلى كائن. في جافا قيمة أي متغير كائن مرجع إلى الكائن يتم تخزينها في أماكن أخرى. قيمة الإرجاع من المشغل الجديد أيضا مرجع. بيان مثل:
يتكون من جزأين. التعبير "()new Date"يجعل كائن نوع تاريخ، وقيمته مرجع إلى كائن تم إنشاؤه حديثا. أن المرجع ثم تخزينها في المتغير "deadline".
يمكنك صراحة تعيين متغير كائن إلى فارغة للإشارة إلى أنها حاليا تشير إلى لا كائن. (if (deadline != null إذا قمت بتطبيق أسلوب لمتغير يحتوي على null ثم يحدث خطأ وقت تشغيل.
String s = birthday.toString(); // runtime error
اذ لم يتم تلقائياً تهيئة المتغيرات إلى null يجب تهيئة لهم أما عن طريق استدعاء جديدة أو بإعداد منهم إلى null.
ولكن في C++لا يوجد أي إشارات لاغية ولا يمكن تعيين المراجع. وينبغي أن تفكر في متغيرات الكائن Java مماثلة للكائن المؤشرات في c فعلى سبيل المثال:
Date birthday; // Java 
هو في الحقيقة نفس:
Date* birthday; //.
بمجرد إجراء هذه الرابطة كل شيء يقع في مكانة. بالطبع ليس تهيئة مؤشر تاريخ حتى تقوم بتهيئته مع مكالمة جديدة. بناء الجملة هو نفسه تقريبا في Java و ++c.
Date* birthday = new Date(); //.
إذا قمت بنسخ متغير واحد إلى آخر ثم كلا المتغيرات تشير إلى نفس التاريخ – فهي المؤشرات إلى الكائن نفسه. ما يعادل مرجع null جافا هو مؤشر NULL في ++C.
في جافا جميع الكائنات الحية في كومة الذاكرة المؤقتة. عندما يتضمن كائن متغير كائن آخر لا يزال هذا المتغير يحتوي على مجرد مؤشر إلى كائن آخر في كومة الذاكرة المؤقتة. في مؤشرات C تجعلك عصبيا لأنهم عرضه لذلك الخطأ. فمن السهل إنشاء مؤشرات سيئة أو خطاء في إدارة الذاكرة. في جافا هذه المشاكل ببساطة الذهاب بعيداً. إذا قمت باستخدام مؤشر غير مهيأ نظام وقت التشغيل موثوق سيقوم بإنشاء خطأ وقت تشغيل بدلاً من إنتاج نتائج عشوائية. كنت لا تقلق بشأن إدارة الذاكرة لأن يعتني أنه جامع البيانات المهملة.
C يجعل محاولة مع دعمها لمنشئات نسخ ومشغلي الإحالة السماح بتنفيذ الأشياء التي تنسخ نفسها تلقائياً. فعلى سبيل المثال نسخة قائمة مرتبطة قائمة جديدة مرتبطة مع محتويات ذاته، لكن مع مجموعة مستقلة من الروابط. و هذا يجعل من الممكن لفئات التصميم مع نسخة نفس السلوك كالأنواع المضمنة. في جافا يجب استخدام أسلوب الاستنساخ للحصول على نسخة كاملة من المتغي.
فئة التقويم الميلادي لمكتبة جافا:
في الأمثلة السابقة قمنا باستخدام فئة التاريخ الذي جزء من مكتبة جافا القياسية. له مثيل من فئة تاريخ دولة هي نقطة معينة في الوقت. 
على الرغم من أن لا تحتاج إلى معرفة هذا عند استخدام فئة التاريخ والوقت يمثل عدد المللي ثانية(إيجابية أو سلبية ) من نقطة ثابتة الذي يعد 00:00:00 بالتَّوْقِيت الْعَالَمِيّ، يناير 1970. التوقيت العالمي (UTS) هو التوقيت العالمي الساعة العلمية القياسية التي هي للأغراض العملية نفسها، و على دراية (GMT)أو توقيت غرينتش.
ولكن كما تبين تاريخ الطبقة ليست مفيدة للغاية للتعامل مع التواريخ. مصمموا مكتبة جافا اتخاذ وجهة نظر أن وصف تاريخ مثل:
"ديسمبر31، 1999، 23:59:59 " هي اتفاقية التعسفية، تحكمها التقويم. ويتبع هذا الوصف خاصة التقويم الميلادي وهو التقويم يستخدم في معظم الأماكن في العالم.
أن وصف نفس النقطة في الوقت المناسب بشكل مختلف تماما في التقاويم القمرية الصينية أو العبرية ناهيك عن التقويم المستخدمة من قبل العملاء من المريخ. مصمم المكتبة قرر فصل الشواغل لحفظ الوقت وإرفاق أسماء للنقاط في الوقت المناسب. ولذلك يحتوي مكتبة جافا القياسية على فئتين منفصلتين فئة التاريخ الذي يمثل نقطة في الوقت، وفئة التقويم الميلادي الذي يعبر عن التواريخ في تدوين التقويم المألوفة. وفي الواقع يمتد فئة التقويم الميلادي فئة تقويم عامة أكثر التي تصف خصائص التقويمات بشكل عام. من الناحية النظرية يمكن توسيع الفئة التقويم وتنفيذ التقويم القمري الصيني أو تقويم المريخ. لكن المكتبة القياسية لا يتضمن أي تطبيقات التقويم إلى جانب التقويم الميلادي.
فصل قياس الوقت من التقويمات حسن تصميم وجوه المنحى. بشكل عام أنها لفكرة جيدة استخدام فئات منفصلة للتعبير عن مفاهيم مختلفة. فئة تاريخ قد سوى عدد قليل من الطرق التي تسمح لك بالمقارنة بين نقطتين في الوقت المناسب. على سبيل المثال، أساليب القبل والبعد تقول لكم إذا كان يأتي نقطة واحدة في الوقت قبل أو بعد آخر:
((if (today.before(birthdayوقد فئة التقويم الميلادي العديد من أساليب أكثر من تاريخ الطبقة. وبالخصوص فقد عدة منشئات مفيدة. التعبير:
يبني كائن جديد يمثل التاريخ والوقت الذي شيد الكائن.
يمكنك إنشاء كائن تقويم لمنتصف الليل في تاريخ محدد بتزويد السنة شهر ويوم: (new GregorianCalendar(1999, 11, 31 
ومن الغريب إلى حد ما تحسب الأشهر من 0. ولذلك 11 هو كانون الأول/ديسمبر. لمزيد من الوضوح وهناك ثوابت مثلCalender.DECEMBER :
(new GregorianCalendar(1999, Calendar.DECEMBER, 31
يمكنك أيضا تعيين الوقت:
(new GregorianCalendar(1999, Calendar.DECEMBER, 31, 23, 59, 59
وبطبيعة الحال سوف تحتاج عادة لتخزين كائن مشيد في متغير:
التقويم الميلادي وتغليف الحقول مثال للحفاظ على التاريخ الذي تم ضبطه. دون النظر في التعليمات البرمجية المصدر من المستحيل معرفة تمثيل الذي استخدمه الفئة داخليا. ولكن بالطبع نقطة التغليف غير مهم. المهم هو مسائل الأساليب التي تكشف عن فئة.
في هذه النقطه ربما كنت تتتسائل: كيف يمكنني تحديد اليوم الحالي او الشهر او السنه لكائن التاريخ ميلادي معين ؟ وكبف يمكنني تغير القيم اذا غير راضي معهم؟ يمكن التعرف على طريقه تنفيذ هذه المهام من خلال النظر إلى الوثائق الفوريه او ملاحضات API في نهايه هذا القسم سوف نتطرق إلى أهم الاساليب في نهايه هذا القسم.
وظيفه التقويم هي حساب السمات مثل التاريخ، يوم من ايام الاسبوع او الشهر او السنه، في وقت معين. للاستعلام عن واحد من هذه الاعدادات، يمكنك استخدام طريقه الاسترجاع (get) على فئه التقويم الميلادي. لتحديد العنصر الذي تريد استرجاعه يمكنك تمرير الثابت المعرف في فئه التقويم مثل Calendar.MONTH او Calendar.DAY_OF_WEEK:
ملاحظات ال API تسرد كل الثوابت التي يمكن استخدامها.
يمكنك تغير مع استدعاء طريقه التعيين (set):
وهناك أيضا طريقة أسهل لضبط السنة والشهر واليوم ومع استدعاء واحد لطريقه التعين (set):وأخيرا، يمكنك الإضافة(add) عدة أيام أو أسابيع أو أشهر، وغيرها، إلى كائن التقويم:
deadline.add(Calendar.MONTH, 3); // move deadline by 3 months
إذا قمت بإضافة رقم سالب، سينتقل التقويم الوراء.
هناك فرق بين مفهومي طريقة الحصول (get) من جهة والإضافة(add) و طريقه الاستعلام (set) من ناحية أخرى. طريقة الحصول (get) يقوم فقط بالبحث عن حالة الكائن واحضاره. اما طريقه الاستعلام (set) والإضافه (add) تقومان بالتعديل حالة الكائن.الأساليب او الطرق التي تغير بناءً على طلب الحقول تسمى بأساليب التغير (mutator)، وتلك التي فقط تتمكن من الوصول إلى الحقول بناءً على الطلب دون تعديل تسمى بطرق الاسترجاع(accessor). 
والمتفق او المتعارف عليه هوالطريقه التي تسمى بطرق الأسترجاع مع (get)، وأساليب التغيير مع (set). على سبيل المثال، فإن فئه التقويم الميلادي (GregorianCalendar) تحتوي على getTime وsetTime التي تسترجع وتعيين الوقت الذي يمثل كائن التقويم:هذه الطرق مفيدة بشكل خاص لتحويل بين التقويم الميلادي و فئه التاريخ. هنا مثال على ذلك. لنفرض أنك تعرف السنة والشهر واليوم و تريد أن تجعل من كائن التاريخ مع هذه الإعدادات. لأن فئه التاريخ لا يعرف شيئاً عن التقويم أولا بناء على كائن التقويم الميلادي(GregorianCalendar) ثم استدعاء طريقة (getTime) للحصول على تاريخ:على العكس من ذلك، إذا كنت تريد أن تجد السنة أو الشهر أو اليوم لكائن التاريخ، كنت بناء كائن التقويم الميلادي (GregorianCalendar)، ضبط الوقت، ومن ثم استدعاء طريقه الاسترجاع(get):
()GregorianCalendar calendar = new GregorianCalendar
(calendar.setTime(hireDay
(int year = calendar.get(Calendar.YEAR
ننتهي من هذا الباب مع البرنامج الذي يضع فئة التقويم الميلادي (GregorianCalendar) للعمل. يعرض برنامج تقويم للشهر الحالي، مثل هذا:
يتم وضع علامة على اليوم الحالي او المحدد بعلامة النجمة (*). كما ترون، يحتاج البرنامج إلى معرفة كيفية حساب طول الشهر وأيام الأسبوع من يوم معين.
لكي نحصي اليوم الحالي والشهر بواسطة استدعاء طريقة الاسترجاع (get) مرتين.
ثم نستخدم طريقه الاستعلام (d (set للشهر الأول من واستخدام طريقه الحصول (get) على أيام الأسبوع من ذلك التاريخ.متغير أيام الأسبوع تحدد لCalendar.SUNDAY إذا كان اليوم الأول من الشهر هو الأحد، إلى Calendar.MONDAY إذا كان يوم الاثنين، إلى اخره. (وهذه القيم هي في الواقع اعداد صحيحة ١، ٢،...، ٧)، ولكن من الأفضل عدم كتابة التعليمات البرمجية التي تعتمد على تلك المعلومه.
آلة الجافا الافتراضية JVM تدرك لغة المستخدم الحالي. (locale) يصف تنسيق الاعراف المحلية، بما فيها بداية الأسبوع وأسماء أيام الأسبوع. (getFirstDayOfWeek) تستخدم للحصول على اليوم الأول من ايام الاسبوع في مكان محدد. 
لتحديد تفصيل البدايه المطلوبة، طرحنا 1 من اليوم من كائن التقويم حتى نصل إلى اليوم الأول من الأسبوع.(while (weekday != firstDayOfWeek
الفئات عادة لم يكن لديها طريق رئيسي. بدلا من ذلك، لديهم حقولهم المثال الخاصة والأساليب. لبناء برنامج كامل، يمكنك الجمع بين عدة فئات، واحدة منها لديها طريق رئيسي.
فئة الموظف
أبسط شكل للتعريف فئة في جافا
فئة اسم الفئة
البناء1
البناء2
الطريقة1
الطريقة2
الحقل1
الحقل2
مراعاة ما يلي، مبسطة جدا، نسخة من فئة الموظفين التي يمكن استخدامها من قبل رجال الأعمال في كتابة نظام الرواتب.
class Employee
// constructor
(public Employee(String n, double s, int year, int month, int day
// a method
()public String getName
// more methods
// instance fields
نحن كسرنا تنفيذ هذه الفئة بشيء من التفصيل في الأقسام التالية. أولا، على الرغم من قائمة 4-2 يوضح البرنامج الذي يدل على فئة الموظف في العمل. في هذا البرنامج، ونحن بنينا مجموعة الموظف وملئناه مع ثلاثة أشياء:التالي، ونحن نستخدم طريقة raiseSalary من فئة الموظف لزيادة الراتب لكل موظف بنسبة 5٪:
(for (Employee e : staffوأخيرا، فإننا طبعنا معلومات حول كل موظف، عن طريق استدعاء أساليب getName، getSalary، وgetHireDay:
(for (Employee e : staff
()System.out.println("name=" + e.getName
لاحظ أن مثال البرنامج يتكون من فئتين: فئة الموظف و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+
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
30. ()public String getName
31. {
32. ;return name
34. ()public double getSalary
35. {
36. ;return salary
EmployeeTest.java
1. ()public Date getHireDay
2. {
3. ;return hireDay
5. (public void raiseSalary(double byPercent
6. {
7. ;double raise = salary * byPercent / 100
8. ;salary += raise
10. ;private String name
11. ;private double salary
12. ;private Date hireDay
البرنامج في قائمة 4-2 واثنين من الفئات في ملف مصدر واحد. العديد من المبرمجين يفضلون وضع كل فئة في الملف المصدر الخاص بها. على سبيل المثال، يمكنك وضع فئة الموظف في ملف Employee.java وEmployeeTest الصف إلى EmployeeTest.java.
إذا كنت مثل هذا الترتيب، ثم لديك خياران لتجميع البرنامج. يمكنك استدعاء مترجم جافا مع البدل: JAVAC الموظف *. JAVA
ثم، سيتم تجميع كافة ملفات المصدر المطابقة للبدل في ملفات فئة. أو، يمكنك كتابة ببساطة
JAVAC EmployeeTest.java
قد تجد أنه من المستغرب أن الخيار الثاني يعمل على الرغم من أن ملف Employee.java أبدا جمعت صراحة. ومع ذلك، عندما يرى مترجم جافا فئة الموظف تستخدم داخل EmployeeTest.java، وسوف نبحث عن ملف اسمه Employee.class. إذا لم تجد هذا الملف، فإنه تلقائيا بالبحث عن Employee.java ثم يجمع عليه. حتى أكثر من ذلك هو الصحيح: إذا كان الطابع الزمني لإصدار Employee.java التي يجدها هو أحدث من ذلك الملف Employee.class القائمة، سوف مترجم جافا إعادة ترجمة الملف تلقائيا.
تشريح فئة الموظف
في المقاطع التي تتبع، ونحن نريد لتشريح فئة الموظف. دعونا نبدأ مع الطرق الموجودة في هذه الفئة. وكما ترون من خلال دراسة شفرة المصدر،
وهذه الفئة لها منشئ واحد وأربعة طرق:
(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
يتم تمييزها عن طرق هذه الفئة مثل الجمهور. الجمهور الكلمة يعني أن أي طريقة في أي فئة يمكن استدعاء الأسلوب. (وتغطي مستويات الوصول الأربع الممكنة في هذا المجال والفصل التالي).
التالي، لاحظ أن ثلاثة حقول المثال سوف يعقد البيانات سنقوم التلاعب داخل مثيل فئة الموظف.
الكلمة خاصة بالتأكد من أن الطرق الوحيدة التي يمكن الوصول إلى هذه الحقول على سبيل المثال هي طرق فئة الموظف نفسه. لا توجد طريقة الخارجي يستطيعون القراءة أو الكتابة إلى هذه المجالات.
وأخيرا، لاحظ أن اثنين من حقول سبيل المثال هم أنفسهم كائنات: الاسم والحقول hireDay إشارات إلى سلسلة وأشياء التسجيل. هذا هو المعتاد جدا: غالبا ما تحتوي على فصول المجالات مثيل نوع فئة.
دعونا ننظر إلى المشيد المدرج في فئة الموظف لدينا
(public Employee(String n, double s, int year, int month, int day
كما ترون، ان اسم المشيد هو نفس اسم الفئة . هذا المشيد يعمل عندما تشيد كائن من فئة الموظف على سبيل المثال، عند إنشاء مثيل فئة الموظف مع رمز مثل هذا:
قمت بتعيين حقول المثيل على النحو التالي
هناك فارق هام بين المشيدات وغيرها من الأساليب. لا يمكن أن ينادى المشيدالا بالتزامن مع المشغل الجديد(new). لا يمكنك تطبيق مشيد إلى كائن موجود لإعادة حقول المثيل.على سبيل المثال،
هو خطأ وقت التحويل البرمجي.
إبقي التالي في عين الاعتبار:
• المشيد له نفس اسم الفئة.
• يمكن أن يكون هناك أكثر من مشيد واحد للفئة.
• يمكن للمشيد ان يكون له صفر، واحد، أو أكثر من المعلمات.
• المشيد ليس له قيمة استرجاع.
• ينادى المشيد دائما مع المشغل الجديد.(new)
طرق تعمل على الكائنات والوصول إلى حقول المثيل بهم.
على سبيل المثال، 
(public void raiseSalary(double byPercent
طريقة raiseSalary له معلمتين. المعلم الأول، ويسمى معلم ضمني،
هو كائن من نوع الموظف الذي يظهر قبل اسم الأسلوب. المعلم الثاني،
داخل القوسين بعد اسم الأسلوب، هو معلم صريحة. كما ترون، يتم سرد المعلمات صريحة صراحة في اعلان الطريقة، على سبيل المثال، byPercent double . 
لا يظهر المعلم الضمني في اعلان الطريقة والكلمة this تشير إلى معلم ضمني. إذا أردت، يمكنك
كتابة طريقة raiseSalary على النحو التالي:
(public void raiseSalary(double byPercent
( getName, getSalary, getHireDay )في النهايه فلنلق نظره عن قرب إلى الطرق البسيطه
()public String getName
()public double getSalary
()public Date getHireDay
هذه أمثلة واضحة على طرق استرجاع. لأنهم ببساطة إرجاع القيم على طلب الحقول، ويطلق عليه أحيانا استرجاع الحقول. لن يكون من السهل جعل الاسم، والراتب، اليوم على انها حقول عامه، بدلا من وجود طرق استرجاع منفصلة؟ وهذه النقطة تعني أن حقل الاسم هو حقل للقراءة فقط.بمجرد تعيينها في المنشئ،
لا توجد طريقة لتغييره.وبالتالي، لدينا ضمان لحقل اسم لن يتلف ابدا. حقل الراتب ليس للقراءة فقط، ولكن يمكن أن يتغير عن طريق 
raiseSalary. على وجه اخص، يجب لا أن تكون القيمة من أي وقت مضى خطأ، فقط يحتاج لهذه الطريقة لتكون تصحيحه. ان حقل الراتب كان عام والسبب في فقد قيمة كان يمكن أن يكون في أي مكان. في بعض الأحيان، قد يحدث أن كنت ترغب في الحصول على قيمه اوتعيين قيمة حقل مقترح. 
تحتاج إلى توفير ثلاثة بنود:
1-حقل البيانات الخاص
2- طريقة استرجاع الحقل العام
3- طريقه تعين الحقل العام
وهنالك ما هو أكثر من ذلك بكثير ولكن صعبه في توفير حقل بيانات عامة محدده، ولكن لها عدد كبير من الفوائد. أولا، يمكنك تغيير التطبيق الداخلي دون التأثير على أي رمز آخر من وأساليب الفئة. على سبيل المثال، إذا تم تغيير تخزين اسم 
ثم يمكن تغيير طريقة 
getName للعودة
firstName + " " + lastName
هذا التغيير غير مرئي تماما فيما يتعلق ببقية البرنامج.
انت تعلم أنه يمكن للطرق الوصول إلى البيانات الخاصة للكائن الذي تم استدعائه. من المستغرب ان يجد كثير من الناس أن الطريقة يمكنها الوصول إلى البيانات الخاصة بجميع كائنات من فئتها. على سبيل المثال، الطريقة equals الأسلوب الذي يقارن بين الموظفين
class Employee
. . .
(boolean equals(Employee other
}
A typical call is
...((if (harry.equals(boss
هذه الطريقة تسمح بالوصول إلى حقول خاصة لهاري(harry)، الذي ليس من المستغرب. فإنه يصل أيضا إلى حقول خاصة من رب العمل(boss). هذا قانوني لأن رئيسه (boss)هو كائن من نوع الموظف، وطريقة لفئة الموظف تسمح للوصول إلى حقول خاصة من أي كائن من نوع الموظف.
عند تنفيذ فئة، نحن نجعل كل مجالات البيانات خاصة لأن البيانات العامة خطرة. ولكن ماذا عن الطرق؟ في حين أن معظم الطرق العامة فان الطرق الخاصة تستخدم في ظروف معينة. في بعض الأحيان، قد ترغب في تفريق رمز طرق منفصلة مساعدة. عادة، هذا المساعد لا ينبغي أن يصبح جزءا من واجهة المستخدم قد تكون قريبة جدا ل التنفيذ الحالي أو يتطلب بروتوكول خاص أو أمر الاستدعاء. فان أفضل طريقة لتنفيذه هو اعطائه طابع الخصوصية. لتنفيذ طابع الخصوصية للطرق فقط قم بتبديل كلمة public إلى كلمة private .
يمكنك تحديد حقل المثيل كنهائي. يجب تهيئة مثل هذا الحقل عند الكائن التي شيدت. وهذا يعني أنه يجب ضمان أنه تم تعيين قيمة الحقل بعد نهاية كل المشيد بعد ذلك، ليس هناك مجال للتعديل مرة أخرى على سبيل المثال، حقل اسم فئة الموظف قد أعلن أنه نهائي لأنه لا يتغير بعد ان تم تشييد الكائن - لا يوجد هناك طريقة setName.
class Employee
. . .
كائن له نسخته من كافة حقول المثيل. على سبيل المثال، لنفترض أننا نريد تخصيص رقم تعريف فريد لكل موظف. نضيف حقل مثيل id و
nextId حقل ثابت إلى فئة الموظف:
class Employee
public class Math
. . .
}
يمكنك الوصول إلى هذا الثابت في البرامج الخاصة بك كما Math.PI. إذا كان قد تم حذف الكلمة static، ثم PI كان يمكن أن يكون حقل مثيل
في فئة الرياضيات. فسوف تكون في حاجة إلى كائن من فئة الرياضيات للوصول إلى PI، وكل كائن من فئة الرياضيات يجب ان يكون له نسخته من PI.
لا يستخدم أي كائن من فئة الرياضيات للقيام بمهمته. فإنه لا يوجد لديه معلم ضمني. يمكنك التفكير في الطرق الساكنة كما الطرق التي ليس لديها المعلم this . بسبب انها طرق ساكنة لا تعمل على الكائنات، لا يمكنك الوصول إلى حقول المثيل من طريق ساكن. ولكن الطرق الساكنة يمكنها الوصول إلى حقول ثابتة في فئتها.
استخدام الطرق الساكنة في حالتين:
Employee.getNextId)
لاحظ أنه يمكنك استدعاء اساليب ساكنة من دون أي الكائنات. على سبيل المثال، أبدا لا تشييد أي كائنات من فئة الرياضيات للاتصال ب Math.pow. لنفس السبب، طريقة main هو اسلوب ساكن.
public class Application
(public static void main(String[] args
// construct objects here
الطريقة main لا تعمل على أي الكائنات. في الواقع، عندما يبدأ البرنامج، ليست هناك أي كائنات حتى الان. ينفذ static main، ويبني الكائنات التي 
يحتاج اليها البرنامج.
لقد رأينا كيف تكتب المشيدات البسيطة التي تحدد الحالة الأولية من الكائنات الخاصة بك. ومع ذلك، لأن تشييد الكائن مهم جدا، جافا يوفر مجموعة متنوعة جدا من الآليات لكتابة المشيدات
تذكر بان فئة GregorianCalendar لها أكثر من مشيد فبامكتننا استخدام احداهما :
or
وهذا ما يسمى بقدرة الحمولة الزائدة. يحدث الحمل الزائد إذا كانت هناك عدة طرق لديها نفس الاسم. ولكن بمعلمات مختلفة. يجب على المترجم فرز الطريقة التي يجب الاتصال بها. فإنه يأخذ الطريقة الصحيحة من قبل مطابقة أنواع المعلمة في رؤوس من الطرق المختلفة مع أنواع القيم المستخدمة في استدعاء طريق المحدد. يحدث خطأ وقت الترجمة إذا كان المترجم لا يمكن أن يتطابق مع المعلمات أو إذا كان هناك أكثر من تطابق ممكن.
إذا لم تقم بتعيين حقل صريح في مشيد، يتم تعيينها تلقائيا إلى افتراضي القيمة: الأرقام إلى 0، القيم المنطقية إلى false، ومراجع الكائن إلى null. ولكنه يعتبر ممارسة البرمجة الفقيرة إلى الاعتماد على هذا. بالتأكيد، فإنه يجعل من الصعب على أي شخص لفهم التعليمات البرمجية الخاصة بك إذا كان يتم تهيئة حقول بخفاء. على سبيل المثال، انظر في فئة الموظف. لنفترض أنك لم تحدد كيفية تهيئة بعض الحقول في المشيد. افتراضيا، سيتم تهيئة الميدان مع راتب 0 وسيتم تهيئة اسم وحقل hireDay مع null. ومع ذلك، فإن ذلك لا يكون فكرة جيدة. إذا كان أي شخص نادى الطريقة getName أو getHireDay سوف يحصل على مرجع فارغ لا يتوقعونه.
calendar.setTime(h); // throws exception if h is null
المشيد الافتراضي هو المشيد بدون أي معلم. على سبيل المثال، هنا هو المشيد الافتراضي لفئة الموظف:
()public Employee
إذا كتبت فئة مع عدم وجود مشيد على الإطلاق، يتم توفير مشيد افتراضي لك. هذا المشيد الافتراضي يحدد كافة حقول المثيل إلى قيمها الافتراضية. لذلك، فإن كل البيانات الرقمية الواردة في مجالات المثيل تكون 0، و كل القيم المنطقية إلى false، وسيتم تعيين كافة متغيرات الكائن إلى قيمة null.
لأنك يمكن أن تفرط في طرق تشييد الفئة ، فمن الواضح يمكنك تشييد طرق عديدة لضبط الحالة الأولية من الحقول مثيل للفئات. هو دائما فكرة جيدة للتأكد من ذلك، بغض النظر عن مناداة المشيد، يتم تعيين كل حقل مثيل إلى شيء مفيد. يمكنك ببساطة تعيين القيمة إلى أي حقل في تعريف الفئة.
class Employee
. . .
ويتم هذا التعيين من قبل تنفيذ المشيد هذه الجملة مفيدة بشكل خاص إذا كانت جميع المشيدات من فئة تحتاج إلى تعيين حقل المثيل خاصا لنفس القيمة. ليس من الضروري ان تكون قيمة التهيئة قيمة ثابتة. هنا هو مثال الذي يتم تهيئة حقل مع استدعاء أسلوب. انظر في فئة الموظف حيث لكل موظف حقل id.
class Employee
. . .
()static int assignId
. . .
عند كتابة مشيدات تافهة جدا يمكن أن يكون من المحبط بعض الشيء التوصل إلى أسماء المعلمات. فلقد قمنا باختيار أسماء المعلمات ذو حرف واحد: 
(public Employee(String n, double s
فإن العيب في ذلك هو أنك ستحتاج إلى قراءة رمز لمعرفة ما تعني المعلمات n و s. بعض المبرمجين يبدأون كل معلمة مع "a"
(public Employee(String aName, double aSalary
تعتمد آخر خدعة شائعة الاستخدام على حقيقة أن المتغيرات المعلمة ظل حقول المثيل بنفس الاسم. على سبيل المثال، في حالة استدعاء المعلم salary، بحيث يشير إلى المعلم، ليس إلى حقل المثيل. لكن لا يزال بإمكانك الوصول إلى حقل المثيل كما this.salary. أذكر أن هذا يدل على معلم ضمني، أي الكائن الذي يتم بناؤه.
(public Employee(String name, double salary
وهذا يشير إلى المعلمة الضمنية لأسلوب الكلمة الأساسية. ولكن الكلمة لها معنى اخرى. إذا كان البيان الأول من مشيد النموذج هذا(...)، ثم استدعاء المشيد مشيد آخر من نفس الفئة. هنا مثال نموذجي: 
(public Employee(double s
(calls Employee(String, double// 
عند استدعاء "(new Employee(60000" بعدها ال" (Employee(Double" المشيد يستدعي مشيد "(Employee (String, Double" . باستخدام هذه الكلمة الرئيسية في هذه الطريقة مفيدة ،فقط تحتاج إلى كتابة رمز البناء المشترك مرة واحدة.
بالفعل رأيتم طريقتين لتهيئة حقل البيانات:
- عن طريق تعيين قيمة في البناء.
-بواسطة تعيين قيمة في الإعلان.
في الواقع هناك الثالثة آلية في جافا. انها تدعى بتهيئة الكتل. يمكن للفئات أن تحتوي على تعريفات كتل التعسفي من التعليمات البرمجية. يتم تنفيذ هذه الكتل عندما يتم إنشاء كائن من هذه الفئة. فعلى سبيل المثال:
class Employee
(public Employee(String n, double s 
()public Employee
. . . 
object initialization block
}
في هذا المثال هو تهيئة حقل معرف في كتلة تهيئة كائن بغض النظر عن الذي يستخدم مشيد إنشاء كائن. يتم تشغيل تهيئة الكتلة أولا وثم يتم تنفيذ نص المنشئ. هذه الآلية غير لازمة وليست شائعة. فإنه عادة ما يكون أكثر وضوحا لوضع رمز التهيئة داخل مشيد. هناك الكثير من السبل لتهيئة حقول البيانات، حيث انه يمكن أن يكون مربكاً جداً في إعطاء جميع المسارات الممكنة لعملية البناء،
وهنا ماذا سيحدث بالتفصيل عندما يتم استدعاء مشيد:
1- يتم تهيئة كافة حقول البيانات إلى قيمتها الافتراضية (0, false, or null).
2- يتم تنفيذ جميع الميدان وكتل التهيئة، في الترتيب الذي تحدث في تعريف فئة.
3-إذا كان السطر الأول من مشيد يدعو مشيد الثاني، ثم يتم تنفيذ مشيد الثاني.
4- ينفذ جسم المشيد.
وبطبيعة الحال، أنها دائماً فكرة جيدة لتنظيم التعليمات البرمجية التهيئة حيث أن مبرمج آخر يمكنه أن يفهم بسهولة دون الحاجة إلى أن يكون محام اللغة. على سبيل المثال سيكون من الغريب جداً، وإلى حد ما خطأ عرضه ليكون فئة المشيدات التي تعتمد على ترتيب فيه يتم تعريف حقول البيانات. يمكنك تهيئة حقل ثابت أما بتوفير قيمة أولية أو باستخدام كتلة تهيئة ثابتة. لقد رأيت بالفعل أول آليه. ;" static int nextId =" 1
إذا كانت الحقول الثابتة من الفئة الخاصة بك تتطلب تعقيداً استخدام رمز التهيئة كتلة تهيئة ثابتة. ضع التعليمات البرمجية داخل كتلة وعلامة عليه مع الكلمة الأساسية ثابتة. هنا مثال على ذلك. نريد أرقام معرف الموظف البدء في عدد صحيح عشوائي أقل من 10000 .
static initialization block static //
التهيئة الثابتة يحدث عندما يتم أولاً تحميل الفئة. المثال مثل حقول حقول ثابتة هي "0, false, null" إلا إذا كنت صراحة تعيينها إلى قيمة أخرى. يتم تنفيذ كافة مهيآت الحقل ثابتة وكتل التهيئة ثابتة في الترتيب الذي تحدث فيه تعريف الفئات.1.^ Horstmann, Cay S., 1959- Core Java Volume 1 Fundamentals 8th edition