می 28, 2019 Mostafa بدون دیدگاه

اگر دنبال برنامه نویس برای ساخت افزونه ،قالب،سایت،برنامه ویندوز،اپلیکیشین اندروید،ربات تلگرام و.... هستید ،سفارش برنامه نویسی را مطالعه نمایید.

توجه : درخواست افزونه ،قالب، اسکریپت و نرم افزار و ... و سوالات و مشکلات خود را در انجمن ارسال نمایید

کلیدواژه ی super در Java یک متغیر یا آبجکت اشاره گر (reference variable) به نمونه ای از نزدیک ترین کلاس پدر می باشد. هر زمان که توسعه دهنده نمونه ی کلاس فرزند را ایجاد می کند، همزمان یک نمونه از کلاس پدر نیز به صورت ضمنی و غیر مستقیم در حافظه ایجاد می گردد. در Java برای اشاره به این نمونه ی ساخته شده از کلاس پدر از کلیدواژه ی super استفاده می شود.

به عبارت ساده تر، با استفاده از واژه ی کلیدی super می توان در کلاس فرزند، اعضای کلاس پدر را فراخوانی کرد.
موارد کاربرد کلیدواژه ی super در جاوا

با استفاده از super می توان به instance variable (متغیر تعریف شده بیرون از متد و داخل کلاس) نزدیک ترین کلاس پدر اشاره کرده و دسترسی داشت.
با استفاده از کلیدواژه ی super می توان متد نزدیک ترین کلاس پدر را فراخوانی کرد.
با استفاده از تابع ()super می توان تابع سازنده (constructor) نزدیک ترین کلاس پدر (immediate parent) را صدا زد.

استفاده از کلیدواژه ی super جهت دسترسی به instance variable کلاس پدر

می توان با استفاده از کلیدواژه ی super به فیلد، متغیر یا عضو داده ای کلاس پدر به راحتی دسترسی پیدا کرد.

البته از این امکان زمانی استفاده می شود که کلاس فرزند و پدر دارای فیلدهای یکسان باشند.

class Animal{  
String color="white";  
}  
class Dog extends Animal{  
String color="black";  
void printColor(){  
System.out.println(color);//prints color of Dog class  
System.out.println(super.color);//prints color of Animal class  
}  
}  
class TestSuper1{  
public static void main(String args[]){  
Dog d=new Dog();  
d.printColor();  
}}

خروجی :

black
white

 

در مثال بالا، Animal و Dog هر دو فیلد مشترکی به نام color را دارند. حال اگر مقدار فیلد color را چاپ کنید، در حالت پیش فرض مقدار فیلد color از کلاس جاری را برای کاربر نمایش می دهد. برای دسترسی و اشاره به این فیلد از کلاس پدر، لازم است از کلیدواژه ی super استفاده نمایید.
استفاده از کلیدواژه ی super جهت فراخوانی متد کلاس پدر

کلیدواژه ی super همچنین می تواند برای فراخوانی متد کلاس پدر بکار رود. این کلیدواژه زمانی استفاده می شود که متد در کلاس فرزند با متد در کلاس پدر یکسان باشد. به عبارت دیگر، کلیدواژه ی super برای فراخوانی متد زمانی مورد استفاده قرار می گیرد که آن متد در بدنه ی کلاس فرزند بازنویسی شده باشد.

class Animal{  
void eat(){System.out.println("eating");}  
}  
class Dog extends Animal{  
void eat(){System.out.println("eating bread");}  
void bark(){System.out.println("barking");}  
void work(){  
super.eat();  
bark();  
}  
}  
class TestSuper2{  
public static void main(String args[]){  
Dog d=new Dog();  
d.work();  
}}

خروجی :

eating
barking

در مثال بالا، Animal و Dog هر دو متد eat() را دارند. اگر متد eat() را از کلاس Dog فراخوانی کنید، در حالت پیش فرض متد eat() از کلاس جاری (Dog) صدا خورده می شود چرا که اولویت با اعضای محلی کلاس می باشد. جهت فراخوانی متد eat() از کلاس پدر (Animal)، لازم است کلیدواژه ی super را بکار ببرید.
استفاده از super جهت فراخوانی تابع سازنده ی (constructor) کلاس پدر

کلیدواژه ی super می تواند برای فراخوانی تابع سازنده ی کلاس پدر بکار رود. مثال:

class Animal{  
Animal(){System.out.println("animal is created");}  
}  
class Dog extends Animal{  
Dog(){  
super();  
System.out.println("dog is created");  
}  
}  
class TestSuper3{  
public static void main(String args[]){  
Dog d=new Dog();  
}}

خروجی :

animal is created
dog is created

نکته : چنانچه تابع ()super یا ()this به صورت صریح در کلاس فراخوانی نشده باشند، کامپایلر jvm آن را خود به صورت اتوماتیک در بدنه ی تابع سازنده ی اضافه می کند.

 

همان طور که قبلا گفته شد، اگر توسعه دهنده تابع سازنده را صریحا اعلان نکرده باشد، کامپایلر به صورت خودکار یک تابع سازنده پیش فرض اضافه می کند. علاوه بر آن تابع سازنده ی پیش فرض، با قرار دادن دستور ()super در اول بدنه، تابع سازنده ی کلاس پدر را نیز صدا می زند.

در زیر مثال کاربردی دیگری از کلیدواژه ی super را مشاهده می کنید. کامپایلر به صورت ضمنی تابع ()super را فراخوانی می کند.

class Animal{  
Animal(){System.out.println("animal is created");}  
}  
class Dog extends Animal{  
Dog(){  
System.out.println("dog is created");  
}  
}  
class TestSuper4{  
public static void main(String args[]){  
Dog d=new Dog();  
}}

خروجی :

animal is created
dog is created

نمونه ای از کاربرد واقعی کلیدواژه ی super

در زیر طی یک مثال کاربردی، مورد استفاده ی واقعی کلیدواژه ی super را مشاهده می کنید. کلاس Emp از کلاس Person ارث بری می کند، بنابراین تمامی ویژگی های (property ها) کلاس Person به صورت پیش فرض در اختیار کلاس Emp قرار می گیرد. به منظور مقداردهی اولیه تمامی property ها (فیلدهای کلاس)، تابع سازنده ی کلاس پدر را در کلاس فرزند صدا می زنیم. بدیهی است که در این راستا تابع سازنده ی کلاس پدر را مجددا استفاده می کنیم.

class Person{  
int id;  
String name;  
Person(int id,String name){  
this.id=id;  
this.name=name;  
}  
}  
class Emp extends Person{  
float salary;  
Emp(int id,String name,float salary){  
super(id,name);//reusing parent constructor  
this.salary=salary;  
}  
void display(){System.out.println(id+" "+name+" "+salary);}  
}  
class TestSuper5{  
public static void main(String[] args){  
Emp e1=new Emp(1,"ankit",45000f);  
e1.display();  
}}

خروجی :

1 ankit 45000

 


برچسب ها