Constructors في الجافا
في هذه المقالة سأتحدث عن Constructors وأنواعها وطريقة كتابتها وتفاصيل أخرى في لغة Java .
بدايةً : سبب كتابة المقال عن constructor
كثير ممن بدأ بتعلم البرمجة يجد صعوبة في فهم ال constructor وحقيقة أنا كنت منهم ولكن مع التطبيق المتواصل لعدة أفكار برمجية فهمت الصورة لذلك لا تكتفي فقط بالقراءة وتظن انك استطعت استيعاب الموضوع كاملاً .
بعد قرائتك لهذا المقال افتح المحرر الموجود عندك وطبق مباشرة .
ماهو constructor ؟
هو عبارة عن دالة من نوع خاص في لغات Object Oriented حيث يتم تجهيز أي Object سوف نستخدمه من هذا الكلاس عن طريقه ونستطيع كتابة متغيرات فيه يستطيع الأوبجكت أن يستخدمها في كلاس آخر و عند تعريف الـ object بكلمة new يعمل ال constructor أولاً .
نقاط مهمة لابد من معرفتها
أولها : أن constructor يأخذ نفس اسم الكلاس وقد يكون في الكلاس الواحد أكثر من constructor ولكن بمتغيرات مختلفة النوع أو العدد وهذا مايسمى ب overloading .
ثانيها : عند استخدام constructor يوجد بداخله متغيرات بنفس أسماء المتغيرات الموجودة في نفس الكلاس لابد أن نستخدم كلمة this تعبيراً عن أن القيمة التي تحملها الدالة هي نفسها القيمة في داخل الكلاس .
سؤال : مالذي سيحصل عند عدم استخدام كلمة this ؟
سوف يقوم المتغير داخل الدالة باخفاء قيمة المتغير الموجود بداخل الكلاس وهذا العملية تسمى Instance Variable hiding حيث يقوم المتغير بداخل أي دالة الذي اسمه بنفس اسم المتغير الموجود في الكلاس باخفاء قيمة المتغير الموجود بالكلاس .
للمعلومية : هذا يحصل حتى في الدوال الأخرى ليس constructor فقط .
public class ConstructorDemo{
String name;
public ConstructorDemo()
{
}
public ConstructorDemo(String name)
{
this.name=name;
}
في المثال السابق أنشأنا constructors 2 الأول كان فارغ من متغيرات ولا يوجد جمل بداخله .
أما الآخر فيحمل متغير بنفس اسم المتغير داخل الكلاس واستخدمنا كلمة this للدلالة على أنه يحمل نفس القيمة لكن لو كان اسم المتغير بالدالة مختلف فلا مشكلة من عدم استخدام this .
لمعلوماتك :
- المتغيرات داخل أي دالة تسمى Local Varaibles وهذه المتغيرات لا نستطيع استخدامها الا داخل الدالة فقط .
- المتغيرات داخل أي كلاس تسمى Instance variables ونستطيع اسخدامها في الدوال الخارجية والكلاسات الأخرى وأي block آخر مهما كان .
ثالثها : أن constructor لا يرجع قيمة ولا يمكن أن نكتب قبله كلمة void حتى .
رابعها : كل كلاس داخل الجافا يوجد به constructor حتى لو لم يعرفه المبرمج ، حيث يقوم الجافا بعمل constructor افتراضي .
خامسها : تستطيع استخدام أي Access modifier عند كتابة constructors , سواءاً كان ذلك public , private or protected أو تجعله افتراضي حيث يستخدام داخل packge فقط ولكن عند استخدام private فانك لاتستطيع اخذ اوبجكت من الكلاس ولاتستطيع عمل اكستند للكلاس لانها تسمى super constructor وعادتاً تستخدم مع الـ singleton pattern
سادسها : ال constructors في الجافا لا يمكن أن تكون static , abstract , final or synchronized كلها غير مسموح بها .
سابعها : ال constructors تستطيع عمل ThrowsException في الجافا .
ثامنها : لا يوجد destructor في الجافا بعكس لغة ++c .
بعض أنواع دوال constructors :
- parameterised constructors :
من اسمه يدل على أن بداخله متغير أو أكثر واذا أنشأنا أوبجكت من هذا الكلاس فلابد من كتابة نفس نوع المتغيرات الموجودة في هذا constructor .
مثال :
class Example
{
int x, y;
Example()
{
}
// parameterized constructor
Example(int a, int b)
{
x = a;
y = b;
}
}
وعند انشاء أوبجكت من هذا الكلاس يصبح كالتالي :
Example e=new Example();
Example e =new Example(0, 50);
- Default constructors :
اذا المبرمج لم ينشئ constructor ستقوم الجافا بانشاء كلاس افتراضي وسيقوم بانشاء متغيرات افتراضية فمثلاً
reference type = null
numreical type = 0 or 0.0 or 0.0f
boolean = false
مثال :
class Student3{
int id;
String name;
void display(){
System.out.println(id+” “+name);
}
public static void main(String args[]){
Student3 s1=new Student3();
s1.display();
}
}
output :
0 null
صيغة كتابة constructor :
Access modifiers _ className()
{
Statement ;
}
مالذي يحدث داخل الذاكرة ؟
عند انشاء constructor ثم انشاء object يتم تخزينه بتركيب بيانات يسمى heap الذي يقوم بتخزين جميع أنواع reference types التي تؤشر على قيمها ال primitive types في تركيب البيانات المسمى stack .
مالفرق بين constructor و methods ؟
- ال constructor يستخدم لتهيئة ال object أما الدوال فتقوم بوصف المتغيرات .
- ال constructor لاترجع أي قيم أما الميثود فقد ترجع قيم .
أخيراً : هل تقتصر وظيفة ال constructor على تهيئة objects فقط ؟
الجواب على هذا السؤال لا طبعاً ، ال constructor يقوم ببدء thread مثلاً وهذا موضوع آخر طبعاً ، أيضاً ال constructor يستطيع استدعاء دوال وإلى آخره .
إلى هنا وأكتفي بهذا القدر من المعلومات ، قد تكون هذه المعلومات معروفة لدي المبرمجين غالباً لكن أعرف أن هناك الكثير من المبتدئين الذين يواجهون صعوبة في فهم هذا الموضوع وأتمنى أن أكون قد أفدتهم ولو بشئ بسيط .
التعليقات (0)
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !