آشنایی با مفهوم Constructor در زبان برنامه‌نویسی جاوا


به طور خلاصه می‌توان گفت که کانستراکتور به منزلۀ متدی در کلاس است که دقیقاً هم‌نام با کلاس مربوطه بوده با این تفاوت که هرگز دیتایی را در خروجی ریترن نمی‌کند؛ به علاوه اینکه کانستراکتور را می‌توان بدون پارامتری ورودی یا با پارامتری ورودی به تعداد دلخواه تعریف نمود (به منظور آشنایی با دستور 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 با مقادیر اختصاصی خودشان در پنجرۀ کنسول نمایش داده شده‌اند.

دانلود فایل‌های تمرین

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
ma90br
ma90br
۱۳۹۷/۱۰/۰۴
با سلام از شما بابت این مطالب ارزشمند سپاسگزارم
yazdang33
yazdang33
۱۳۹۷/۰۵/۲۱
واقعا عالی بود این آموزش. با همه ی آموزشا فرق داشت.
Sharifi_7
Sharifi_7
۱۳۹۷/۰۵/۱۴
آموزش کانستراکتور بسیار سخته و تمامی سایت ها بسیار مسئله را پیچیده کردند ولی توضیحات استاد مرادی فوق العاده روان و با بیانی شیوا ارائه شده و دیگه از این راحت تر پیدا نخواهید کرد.
هرکی دنبال آموزش جاوا مقدماتی هست این بهترین رفرنس موجود فارسی می باشد.
با سپاس از استاد ارجمند
کاربر میهمان
ashkanمن یک کاربر مهمان هستم
۱۳۹۶/۰۱/۱۹
۱- در جواب کاربر اقای bobby اگر خودشون دیدن یا بقیه. یک چیزی رو توصیه میکنم. من با اینکه سه روزه کلا وارد برنامه نویسی شدم. دیپلم هم ندارم. ولی متوجه شدم که کانستراکتور در حقیقت مقدار field ی که از کلاس قبلی ابجکت کردیم تو کلاس اصلی. رو ناشناس یا بدون مقدار میزاره که ما بتونیم مقدار رو خودمون وارد کنیم. که دوباره با فراخوندن دوباره متد دوباره یه سری مقدار های جدید بهش بدیم. توصیمم این بود اول بخ تمام کلمه های آموزش دونه دونه دقت کنید. یکیم اینکه کلماتی مثل field رو دقت کنید که یاد بگیرید.
۲_ از کسانی که این آموزش و ساختن واقعاً ممنونم. که واقعا جوری آموزش میدن من که کلا سه روزه فهمیدم برنامه نویسی چیه همه چیو درک کردم. واقعا ممنونم
کاربر میهمان
bobbyمن یک کاربر مهمان هستم
۱۳۹۵/۰۹/۲۰
سلام خسته نباشید . من کلا فلسفه وجودی و لزوم وجود کانسترکتور رو درک نمیکنم. میشه در این مورد توضیح بدین یا یه ریفرنس معرفی کنید؟ ممنون
iman
iman
۱۳۹۵/۰۷/۲۶
Thanks
کاربر میهمان
reza asadiمن یک کاربر مهمان هستم
۱۳۹۵/۰۶/۱۲
عااااالی
زنده باشید
کاربر میهمان
reza sobhaniمن یک کاربر مهمان هستم
۱۳۹۵/۰۵/۲۵
وجدانا خیلی عالی بود....دمتون گرم....
کاربر میهمان
mohammadمن یک کاربر مهمان هستم
۱۳۹۵/۰۵/۱۶
بسیار عالی بود
ان شا الله خدا اجرتون بده
کاربر میهمان
Mohammad Amiriمن یک کاربر مهمان هستم
۱۳۹۵/۰۴/۱۰
حالا این کانستراکتور به چه دردی خورد؟
وقتی کمپایلر خودش اونو تو بکگروند ایجاد میکنه ما دیگه چرا خودمون رو زحمت بدیم؟
اگه واقعا بدرد بخور هست لطفا راهنمایی کنید.
ممنون!