به طور خلاصه میتوان گفت که کانستراکتور به منزلۀ متدی در کلاس است که دقیقاً همنام با کلاس مربوطه بوده با این تفاوت که هرگز دیتایی را در خروجی ریترن نمیکند؛ به علاوه اینکه کانستراکتور را میتوان بدون پارامتری ورودی یا با پارامتری ورودی به تعداد دلخواه تعریف نمود (به منظور آشنایی با دستور return
به آموزش آشنایی با متدهایی با مقادیر برگشتی در زبان برنامهنویسی جاوا مراجعه نمایید.)
در واقع، زمانی که آبجکتی از روی یک کلاس میسازیم، کانستراکتور آن کلاس فراخوانی شده و متغیرهای فیلد تعریفشدهِ در کلاس مربوطه را مقداردهی میکند. به علاوه، توجه داشته باشیم که برای ساخت آبجکتی جدید از روی یک کلاس نیاز به یک کانستراکتور داریم و در صورتی که کانستراکتوری برای کلاس تعریف نکنیم، خود کامپایلر به صورت خودکار و در حین ساخت آبجکت از روی کلاس مورد نظر کانستراکتوری فاقد پارامتر ورودی میسازد که تحت عنوان Default Constructor یا «کانستراکتور پیشفرض» شناخته میشود که در چنین شرایطی تمامی متغیرهای فیلد در کلاس مذکور با مقادیر پیشفرض مقداردهی میشوند به طوری که مقدار صفر برای متغیرهای تعریفشده با دیتا تایپهای int
،double
و غیره در نظر گرفته میشود، مقدار false
برای متغیرهای تعریفشده با دیتا تایپ boolean
و در نهایت مقدار null
برای آبجکتهای ساختهشده از روی کلاس String
اختصاص داده میشود. در عین حال، چنانچه کانستراکتوری برای کلاس خود بنویسیم، کامپایلر هیچ گونه کانستراکتور پیشفرضی به صورت خودکار برای کلاس مذکور نمیسازد.
اکنون به منظور درک نحوۀ کار کانستراکتورها، پروژهای تحت عنوان Constructor در آیدیای اکلیپس ایجاد کرده و کلاسی به نام MyClass
در آن میسازیم و در ادامه کد مربوط به این کلاس را به صورت زیر تکمیل میکنیم:
public class MyClass {
String name;
int age;
boolean trueOrFalse;
public void dispaly() {
System.out.println(name);
System.out.println(age);
System.out.println(trueOrFalse);
}
}
در کد فوق، سه متغیر از جنسِ فیلد تحت عناوین age
،name
و trueOrFalse
تعریف کردهایم که برای تعریف آنها نیز به ترتیب از کلاس String
، دیتا تایپ int
و boolean
استفاده نمودهایم و در ادامه متدی به نام ()display
ساخته و در آن گفتهایم که در صورت فراخوانی، متغیرهای فیلد تعریفشده در داخل کلاس را در بخش کنسول چاپ نماید.
حال کلاسی دیگر تعریف میکنیم تا به عنوان نقطۀ شروع برنامه باشد و در آن آبجکتی جدید از روی کلاس MyClass
ساخته تا در نهایت ببینیم که نحوۀ عملکرد کانستراکتور در این کلاس چگونه میباشد. از همین روی، کلاسی تحت عنوان ActionClass
تعریف کرده و در حین ساخت آن نیز تیک گزینۀ public static void main را میزنیم تا متد ()main
در این کلاس تعریف شود و در ادامه کد مربوط به کلاس ActionClass
را به صورت زیر تکمیل میکنیم:
public class ActionClass {
public static void main(String[] args) {
MyClass objectOne = new MyClass();
objectOne.dispaly();
}
}
در کد فوق، آبجکتی جدید از روی کلاس MyClass
تحت عنوان objectOne
ساخته و در ادامه متد ()display
از کلاس مذکور را روی آبجکت ساختهشده فراخوانی نمودهایم به طوری که در خروجی خواهیم داشت:
null
0
false
همانطور که مشاهده میکنیم، کامپایلر به صورت خودکار یک کانستراکتور پیشفرض برای آبجکت ساختهشده از روی کلاس MyClass
ایجاد کرده و در ادامه کانستراکتور مذکور مقادیری پیشفرض را به متغیرهای فیلد تعریفشده در این کلاس اختصاص میدهد (البته توجه داشته باشیم که کانستراکتور پیشفرض در حین کامپایل شدن ساخته میشود و از همین روی از دید ما مخفی میباشد.) همانطور که میبینیم، مقدار پیشفرض null
برای آبجکت name
ساختهشده از روی کلاس String
، مقدار صفر برای متغیر age
بوده و مقدار بولین false
نیز برای متغیر trueOrFalse
در نظر گرفته شده است.
در ادامه نحوۀ تعریف کانستراکتور در کلاس را مورد بررسی قرار میدهیم و برای این منظور کد کلاس MyClass
را به صورت زیر تکمیل میکنیم:
public class MyClass {
String name;
int age;
boolean trueOrFalse;
MyClass() {
name = null;
age = 0;
trueOrFalse = false;
}
public void dispaly() {
System.out.println(name);
System.out.println(age);
System.out.println(trueOrFalse);
}
}
همانطور در کد فوق میبینیم، کانستراکتوری تحت عنوان MyClass
ساختهایم و داخل آن به متغیرهای فیلد تعریفشده در کلاس تحت عناوین age
،name
و trueOrFalse
به ترتیب مقادیر اولیۀ null
، عدد صفر و مقدار بولین false
را اختصاص دادهایم و توجه داشته باشیم که تعریف کانستراکتور فوق هیچ تفاوتی با عدم تعریف آن برای کلاس ندارد چرا که کامپایلر جاوا به صورت خودکار کانستراکتوری بدین صورت را برای آبجکت ساختهشده از روی این کلاس ساخته و آن را فراخوانی مینماید که این فرآیند را در تصویر زیر آوردهایم:
در این مرحله برای تست کانستراکتور فوق آن را کامنت میکنیم و مجدداً برنامه را اجرا میکنیم تا ببینیم که کامپایلر جاوا به صورت خودکار این کار را انجام میدهد یا خیر که مشابه مثال پیشین میبینیم که باز هم همان مقادیر اولیه توسط کامپایلر ایجاد شده و در نهایت در کنسول چاپ میشوند. حال قصد داریم تا کانستراکتوری در برنامه تعریف کرده و بدین ترتیب در صورت ساخت آبجکتی از روی این کلاس، مقادیری به غیر از مقادیر پیشفرض به متغیرهای فیلد اختصاص دهیم که برای این منظور کد مربوط به کلاس MyClass
را به صورت زیر تغییر میدهیم:
public class MyClass {
String name;
int age;
boolean trueOrFalse;
MyClass(String myName, int myAge, boolean myTrueOrFalse) {
name = myName;
age = myAge;
trueOrFalse = myTrueOrFalse;
}
public void dispaly() {
System.out.println(name);
System.out.println(age);
System.out.println(trueOrFalse);
}
}
همانطور که در کد فوق ملاحظه میکنیم، سه پارامتر ورودی تحت عناوین myAge
،myName
و myTrueOrFalse
برای کانستراکتور در نظر گرفتهایم که در تعریف آنها نیز دقیقاً از دیتا تایپ مورد استفاده در تعریف متغیرهای فیلد کلاس استفاده نمودهایم و در داخل کانسراکتور نیز مقادیر مربوط به پارامترهای ورودی را به متغیرهای فیلد تعریفشده در کلاس منتسب کردهایم بدین معنی که در هنگام ساخت آبجکت از روی این کلاس، کانستراکتور فوق فراخوانی شده و مقادیر تعریفشده به عنوان ورودی برای آبجکت مذکور را به ترتیب به متغیرهای فیلد منتسب میکند.
به علاوه، توجه داشته باشیم که در صورت یکی بودن نام پارامترهای ورودی و متغیرهای فیلد، کامپایلر جاوا در حین کامپایل برنامه مقادیر اولیۀ متغیرهای فیلد را برای آنها در نظر میگیرد اما راهحلی جهت تعریف پارامترهای ورودی و متغیرهای فیلد به صورت همنام در کلاس وجود دارد که در آن میتوانیم از کیورد this
پیش از نام متغیرهای فیلد در داخل کانستراکتور استفاده کرده و بدین ترتیب متغیرهای مربوط به پارامتر ورودی را به متغیرهای فیلد تعریفشده در کلاس منتسب نماییم که برای درک بهتر این موضوع، کد فوق را به صورت زیر ریفتکور میکنیم:
public class MyClass {
String name;
int age;
boolean trueOrFalse;
MyClass(String name, int age, boolean trueOrFalse) {
this.name = name;
this.age = age;
this.trueOrFalse = trueOrFalse;
}
public void dispaly() {
System.out.println(name);
System.out.println(age);
System.out.println(trueOrFalse);
}
}
همانطور که ملاحظه میکنیم، کلیدواژۀ this
را قرار داده سپس یک علامت .
نوشته و در ادامه نام متغیر فیلد مد نظر را مینویسیم و در نهایت با استفاده از عملگر =
پارامترهای ورودی کانستراکتور را به متغیرهای فیلد متناظرشان منتسب میکنیم که در این صورت کامپایلر جاوا با اجرای دستور this.name
به دنبال متغیر name
در داخل همان کلاس گشته و مقدار اختصاصیافته به متغیر name
در پارامتر ورودی را بدان منتسب مینماید.
اکنون پس از تعیین مقدار اولیۀ متغیرهای فیلدِ کلاس MyClass
از طریق پارامترهای ورودی کانستراکتور، برنامۀ فوق را اجرا میکنیم و برای این منظور نیز در کلاس ActionClass
به صورت زیر آبجکتی از روی کلاس MyClass
میسازیم:
public class ActionClass {
public static void main(String[] args) {
MyClass objectOne = new MyClass("Sahand", 27, true);
objectOne.dispaly();
}
}
اکنون در صورت ساخت آبجکت جدید از روی کلاس MyClass
کانستراکتور این کلاس فراخوانی میشود و به خاطر داریم که برای کانستراکتور مذکور سه پارامتر ورودی تعریف کردهایم که به ترتیب از جنس استرینگ، عدد صحیح و بولین بودند. حال به منظور ساخت آبجکت از روی کلاس MyClass
در کلاس ActionClass
میتوانیم مقادیری را به عنوان ورودی برای آبجکت جدید در نظر بگیریم که بدین ترتیب کانستراکتور آنها را به متغیرهای فیلد تعریفشده در کلاس و مرتبط با آبجکت مربوطه اختصاص میدهد. همانطور که در کد فوق مشاهده میکنیم، با اجرای برنامه مقدار استرینگ «Sahand» به متغیر name
، عدد 27 به متغیر age
و مقدار بولین true
نیز به متغیر trueOrFalse
اختصاص داده میشود به طوری که پس از اجرای برنامه در خروجی خواهیم داشت:
Sahand
27
true
همانطور که میبینیم، با موفقیت توانستیم مقدار اولیۀ متغیرهای فیلد کلاس MyClass
را مقداردهی نماییم. اکنون فرض کنیم که دو آبجکت تحت عناوین objectOne
و objectTwo
از روی کلاس MyClass
میسازیم و برای مقداردهی هر دوی آنها کد فوق را به صورت زیر تکمیل میکنیم:
public class ActionClass {
public static void main(String[] args) {
MyClass objectOne = new MyClass("Sahand", 27, true);
objectOne.dispaly();
MyClass objectTwo = new MyClass("Mohammad Ali", 31, false);
objectTwo.dispaly();
}
}
در کد فوق، دو آبجکت از روی کلاس MyClass
تحت عناوین objectOne
و objectTwo
ساختهایم و برای آبجکت دوم نیز مقادیر اولیۀ فوق را اختصاص دادهایم به طوری که در صورت اجرای برنامۀ فوق در خروجی خواهیم داشت:
Sahand
27
true
Mohammad Ali
31
false
همانطور که میبینیم، هر دو آبجکت ساختهشده از روی کلاس MyClass
با مقادیر اختصاصی خودشان در پنجرۀ کنسول نمایش داده شدهاند.