در این آموزش کلیدواژۀ super را معرفی میکنیم که از جمله کیوردهای مورد استفاده در وراثت و مباحث مربوط به دسترسی به متغیرها و متدهای تعریفشده در کلاسهای به اصطلاح Superclass یا «کلاسهای والد» میباشد. در واقع، کیورد super به منظور دسترسی به متدها و متغیرهای کلاس والد در کلاس فرزند مورد استفاده قرار میگیرد (جهت کسب اطلاعات بیشتر در رابطه مفهوم وراثت، توصیه میکنیم به آموزش آشنایی با مفهوم وراثت در زبان برنامهنویسی جاوا مراجعه نمایید.)
بهکارگیری کیورد super به منظور دسترسی به متغیرهای کلاس اصلی
در این بخش از آموزش به منظور درک بهتر مطالب ارائهشده، ابتدا پروژهای به نام Super ایجاد کرده و سه کلاس در آن تحت عناوین SubClass ،SuperClass و ActionClass میسازیم که کلاس سوم به عنوان نقطۀ شروع برنامه بوده و در حین ساخت آن نیز تیک گزینۀ public static void را میزنیم. در ادامه، کلاس SuperClass را به صورت زیر تکمیل مینماییم:
public class SuperClass {
int speed = 280;
public void showLexusSpeed() {
System.out.println("Lexus speed is " + speed);
}
}
در کد فوق، داخل کلاس SuperClass با استفاده از دیتا تایپ int یک متغیر فیلد تحت عنوان speed ایجاد کرده و مقدار اولیۀ آن را معادل عدد 280 قرار دادهایم سپس یک متد از جنس void تحت عنوان ()showLexusSpeed تعریف کردهایم که این وظیفه را دارا است تا در صورت فراخوانی، مقدار منتسب به متغیر speed را با استفاده از عملگر + با استرینگ «Lexus speed is» کانکت کرده و در کنسول چاپ نماید. اکنون کلاس SubClass را به گونهای پیادهسازی مینماییم تا از کلاس SuperClass ارثبری کند:
public class SubClass extends SuperClass {
int speed = 260;
public void showToyoTaSpeed() {
System.out.println("Toyota speed is " + speed);
}
}
همانطور که در کد فوق مشاهده میکنیم، کلاس SubClass از کلاس SuperClass ارثبری میکند که این کار را با استفاده از کیورد extends انجام دادهایم سپس با استفاده از دیتا تایپ int متغیری به نام speed تعریف کرده و این بار مقدار 260 را بدان اختصاص دادهایم. در ادامه، متدی تحت عنوان ()showToyotaSpeed در این کلاس تعریف کرده و دستورات داخلی متد مذکور به منظور چاپ مقدار منتسب به متغیر speed به همراه استرینگ «Toyota speed is» در بخش کنسول را در آن نوشتهایم.
اکنون قصد داریم تا آبجکتی از روی کلاس SubClass ساخته و بدین ترتیب به متد کلاس مذکور دسترسی داشته و آن را در کلاس ActionClass روی آبجکت جدید ساختهشده فراخوانی نماییم که برای این منظور کلاس ActionClass را به صورت زیر تکمیل میکنیم:
public class ActionClass {
public static void main(String[] args) {
SubClass myObject = new SubClass();
myObject.showToyoTaSpeed();
}
}
در کد فوق، آبجکتی از روی کلاس SubClass به نام myObject ساخته سپس متد ()showToyotaSpeed از این کلاس را روی آبجکت myObject فراخوانی کردهایم به طوری که در خروجی خواهیم داشت:
Toyota speed is 260همانطور که مشاهده میکنیم، اجرای برنامۀ فوق منجر به فراخوانی متد ()showToyotaSpeed شده و در نتیجه استرینگ مربوطه در کنسول چاپ میشود. نکتۀ قابلتوجه در ارتباط با متغیر speed این است که متغیر مذکور هم در SuperClass و هم در SubClass تعریف شده است و علیرغم ارثبری کلاس SubClass از SuperClass، آبجکت ساختهشده از روی این کلاس متغیر speed از کلاس فرزند را مد نظر قرار داده و در فراخوانی متد ()showToyotaSpeed نیز آن را به عنوان آرگومان ورودی به متد مذکور داده است.
حال فرض کنیم اگر بخواهیم تا در فراخوانی متد ()showToyotaSpeed از کلاس SubClass مقدار منتسب به متغیر speed از کلاس SuperClass مد نظر قرار داده شده و مقدار آن در کنسول چاپ شود که در چنین شرایطی میتوانیم کیورد super را به صورت زیر مورد استفاده قرار دهیم:
public class SubClass extends SuperClass {
int speed = 260;
public void showToyoTaSpeed() {
System.out.println("Toyota speed is " + super.speed);
}
}
در کد فوق، کیورد super را پیش از نام متغیر speed قرار داده سپس یک علامت . و در نهایت نام متغیر را نوشتهایم که در این صورت میتوانیم به مقدار منتسب به متغیر speed از کلاس اصلی دسترسی داشته باشیم به طوری که اگر مجدداً برنامه را اجرا کنیم، در خروجی خواهیم داشت:
Toyota speed is 280همانطور که ملاحظه میکنیم، درج کیورد super در کنار نام متغیر منجر بدین شده است تا مقدار منتسب به متغیر مذکور از SuperClass در متد ()showToyoTaSpeed متعلق به کلاس SubClass در نظر گرفته شده و به همراه استرینگ مربوطه در کنسول نمایش داده شود.
بهکارگیری کیورد super به منظور دسترسی به متدهای کلاس اصلی
در این بخش از آموزش قصد داریم تا به بررسی نحوۀ استفاده از کلیدواژۀ 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();
}
}
در کد فوق، آبجکتی تحت عنوان myObject از روی کلاس SubClass ساخته و در ادامه متد ()showSubClass از کلاس SubClass را روی آن فراخوانی کردهایم به طوری که پس از اجرای برنامه در خروجی خواهیم داشت:
This is the SubClass methodهمانطور که انتظار داشتیم، استرینگ مربوط به کلاس SubClass در کنسول چاپ شده است. اکنون اگر بخواهیم با استفاده از کلیدواژۀ super متد ()showSuperClass از SuperClass را داخل متد ()showSubClass از کلاس SubClass فراخوانی نماییم، میباید کد کلاس SubClass را به شکل زیر ویرایش نماییم:
public class SubClass extends SuperClass {
public void showSubClass() {
System.out.println("This is the SubClass method");
super.showSuperClass();
}
}
در حقیقت، با نوشتن کلیدواژۀ super و قرار دادن یک . سپس نوشتن نام متد ()showSuperClass از کلاس والد، به متد کلاس مورد نظر در کلاس فرزند دسترسی داشته و آن را فراخوانی مینماییم به طوری که با اجرای برنامۀ فوق در خروجی خواهیم داشت:
This is the SubClass method
This is the SuperClass methodهمانطور که مشاهده میکنیم، علاوه بر متد ()showSubClass از کلاس SubClass متد ()showSuperClass از کلاس SuperClass نیز با استفاده از دستور super فراخوانی شده و منجر به چاپ استرینگ مربوطه در کنسول شده است.
