معرفی کلیدواژه ی super در زبان برنامه نویسی جاوا


یکی از مباحثی که تسلط به آن در رابطه با به کار گیری وارثت در زبان برنامه نویسی جاوا ضروری است نحوه به کارگیری کلید واژه ی super است. چنانچه بخواهیم به طور خلاصه کاربرد کلید واژه ی super را بیان کنیم، بایستی گفت هر موقع که بخواهیم در کلاس های Subclass یک متد، متغیر و یا کانستراکتور قرار گرفته در Superclass فرا بخوانیم می بایست از کلید واژه ی super استفاده کنیم. برای روشن شدن اهمیت این کلید واژه به توضیحات بیشتر در قالب یک پروژه خواهیم پرداخت. پروژه جدیدی در اکلیپس تحت عنوان Super ایجاد کرده و دو کلاس به اسم های SuperClass و SubClass به معنی به ترتیب "کلاس اصلی" و "کلاس زیرشاخه" در آن می سازیم. برای کلاسی که قرار است به منزله نقطه شروع برنامه باشد نام ActionClass به معنی "کلاس عملیاتی" را در نظر گرفته و گزینه public static void را برای آن تیک دار می کنیم. در این مرحله نیاز است تا کلاس SuperClass را به شکل زیر تکمیل نماییم:

public class SuperClass {
    int speed = 280;
    public void showLexusSpeed() {
        System.out.println("Lexus speed is " + speed);
    }
}

در کد فوق در کلاس SuperClass یک Instance Variable از جنس int تحت عنوان speed به معنی "سرعت" ایجاد کرده ایم و مقدار اولیه آن را معادل با 280 قرار داده ایم (منظور 280 کیلومتر در ساعت است) سپس یک متد از جنس void تحت عنوان showLexusSpeed به معنی "سرعت لکسوس را نمایش بده" ایجاد کرده ایم. در نهایت با استفاده از دستور ;()System.out.println می خواهیم مقدار متغیر speed را در پنجره ی کنسول نمایش دهیم.

در این دستور علاوه بر نشان دادن مقدار متغیر speed می خواهیم جمله Lexus speed is به معنی "سرع لکسوس برابر است با ..." هم نشان داده شود. برای همین منظور، این جمله را داخل دو علامت " " نوشته و یک علامت + قرار داده سپس نام متغیر خود را می نویسیم. اکنون نوبت به تکمیل کد کلاس SubClass می رسد که می بایست به شکل زیر عمل کنیم:

public class SubClass extends SuperClass {
    int speed = 260;
    public void showToyoTaSpeed() {
        System.out.println("Toyota speed is "+speed);
    }
}

همان طور که در کد فوق مشاهده می شود، کلاس SubClass از کلاس SuperClass ارث بری خواهد کرد (این کار با استفاده از کلید واژه ی extends به علاوه نام کل SuperClass صورت می گیرد.) مجدد یک متغیر از جنس int تحت عنوان speed ایجاد کرده ولی این بار مقدار اولیه 260 را برای آن در نظر می گیریم. متد ساخته شده در این کلاس showToyotaSpeed به معنی "سرعت تویوتا را نشان بده" می باشد. در نهایت همانند کلاس قبلی از دستور ;()System.out.println استفاده می کنیم تا مقدار متغیر speed را به علاوه جمله ی Toyota speed is به معنی "سرعت تویوتا برابر است با ..." در پنجره ی کنسول نمایش دهیم. اکنون می خواهیم از روی این کلاس یک آبجکت ساخته و آن را در متد main در کلاس ActionClass نمایش دهیم. برای همین منظور کلاس ActionClass را به شکل زیر تکمیل می کنیم:

public class ActionClass {
    public static void main(String[] args) {
        SubClass myObject = new SubClass();
        myObject.showToyoTaSpeed();
    }
}

همان طور که در کد فوق مشاهده می شود یک آبجکت از روی کلاس SubClass به نام myObject به معنی "شیء من" ساخته، سپس با استفاده از این آبجکت، متد موجود در داخل کلاس SubClass را فرا می خوانیم. حال برنامه را اجرا می کنیم:

همان طور که در تصویر فوق مشاهده می شود برنامه متد showToyotaSpeed را فراخوانده و خروجی آن را در پنجره ی کنسول نمایش می دهد. نکته ای که در اینجا می بایست مد نظر قرار داده شود این است هم در کلاس SuperClass و هم در کلاس SubClass ما متغیر speed را ایجاد کرده ایم. در اجرای فوق علیرغم این که کلاس SubClass از کلاس SuperClass ارث بری می کند، اما این در حالی است که آبجکت ساخته شده از روی این کلاس، از متغیر موجود داخل SubClass استفاده می کند و نتیجه این می شود که سرعت 260 کیلومتر در ساعت برای خودروی تویوتا در نظر گرفته می شود. حال فرض کنیم می خواهیم از عمد کاری کنیم که مقدار متغیر speed موجود در کلاس SuperClass در این متد فراخوانده شود. برای این منظور کد خود در داخل متد SubClass را به شکل زیر ویرایش می کنیم:

public class SubClass extends SuperClass {
    int speed = 260;
    public void showToyoTaSpeed() {
        System.out.println("Toyota speed is " + super.speed);
    }
}

همان طور که در کد فوق ملاحظه می شود، قبل از speed از کلید واژه ی super به علاوه یک نقطه استفاده کرده ایم. مجدداً برنامه را اجرا می کنیم:

می بینیم که کلید واژه ی super این دستور را به برنامه می دهد که بایستی برود از متغیر موجود در کلاس اصلی استفاده کند. بنابراین مقدار 280 کیلومتر در ساعت برای خودروی تویوتا در نظر گرفته می شود. اکنون ببینیم که به چه نحوی می توان از کلید واژه super برای متدها استفاده کرد. برای روشن شدن مطلب کد کلاس SuperClass را به شکل زیر بازنویسی می کنیم:

public class SuperClass {
    public void showSuperClass() {
        System.out.println("This is the SuperClass method");
    }
}

در کد فوق یک متد تحت عنوان showSuperClass به معنی "کلاس اصلی را نشان بده" ساخته و وظیفه این متد آن است که عبارت This is the SuperClass method به معنی "این متد کلاس اصلی است" را نمایش دهد. سپس به صورت زیر اقدام به بازنویسی کلاس SubClass می کنیم:

public class SubClass extends SuperClass {
    public void showSubClass() {
        System.out.println("This is the SubClass method");
    }
}

در کد فوق یک متد تحت عنوان showSubClass به معنی "کلاس زیرمجموعه را نشان بده" ساخته و به آن دستور داده ایم تا عبارت This is the SubClass method را به معنی "این متد کلاس زیر مجموعه است" را نمایش دهد. در نهایت کد کلاس ActionClass را به شکل زیر بازنویسی می کنیم:

public class ActionClass {
    public static void main(String[] args) {
        SubClass myObject = new SubClass();
        myObject.showSubClass();
    }
}

حال قصد داریم تا به برنامه خود دستور دهیم تا متد موجود در کلاس زیرمجموعه را تحت عنوان showSubClass را روی صفحه مانیتور نمایش دهد. برنامه را اجرا کرده و  خروجی زیر را مشاهده خواهیم کرد:

همان طور که انتظار می رفت هر دستوری که داخل متد showSubClass می باشد اجرا شده است. اکنون اگر بخواهیم با استفاده از کلید واژه ی super متد خود را مجبور کنیم تا متد موجود در کلاس اصلی را نیز نمایش دهد، می بایست کد کلاس زیر مجموعه را به شکل زیر ویرایش نماییم:

public class SubClass extends SuperClass {
    public void showSubClass() {
        System.out.println("This is the SubClass method");
        super.showSuperClass();
    }
}

در حقیقت با نوشتن کلید واژه super و قرار دادن یک نقطه و نوشتن نام متدی از کلاس اصلی که می خواهیم نمایش داده شود، برنامه خود را مجبور می کنیم تا اینکار انجام دهد. اکنون برنامه را مجدد Run می کنیم و انتظار می رود که خروجی زیر ایجاد گردد:

همانطور که مشاهده می شود علاوه بر متد موجود در کلاس SubClass متد موجود در کلاس SuperClass نیز با استفاده از دستور super فرا خوانده شده است.

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


بهزاد مرادی

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
۱۳۹۶/۱۲/۱۳
سلام بسیار ممنون بابت آموزش خوبتون
من فایل تمرینی تون رو دانلود کردم ولی نمی تونم پیدا کنم میشه راهنمایی کنید که در کدام یک از بخش های
src , bin , project یا فایلی دیگری هست؟
سپاس گزارم
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
۱۳۹۶/۱۱/۳۰
ممنون از اینکه این مطلب را تهیه کرده بودید. مفید بود.
کاربر میهمان
Shirinمن یک کاربر مهمان هستم
۱۳۹۵/۱۰/۲۳
کجا می تونم اطلاعاتی در باره composition و specialization
(relationship between super and subclass ‍)پیدا کنم؟ متشکرم
nahid
nahid
۱۳۹۵/۰۹/۱۶
بسیار عالی تشکر از مدرس عزیز
mohammad
mohammad
۱۳۹۵/۰۶/۱۱
تدریس ت حرف نداره!!!
کاربر میهمان
امیرمن یک کاربر مهمان هستم
۱۳۹۵/۰۱/۱۵
با سلام
توی آخرین کد که کلاس SubClass اصلاح شد و کلید واژه super قبل ازshowsuperclass اومد اگه super رو حذف کنیم بازم نتیجه یکسان میشه
من این قسمت آخر رو درست متوجه نشدم شایدم درست متوجه شدم ولی کاربردشو نفهمیدم
عیسی پور
عیسی پور
۱۳۹۴/۱۰/۲۴
بسیار عالی
دست گلتون درد نکنه