در این آموزش با کلمه کلیدی super در جاوا با کمک مثال آشنا می شوید.
کلمه کلیدی super در جاوا در زیر کلاس ها برای دسترسی به اعضای سوپر کلاس (ویژگی ها ، سازنده ها و متد ها) استفاده می شود. قبل از اینکه در موردکلمه کلیدی super بیاموزیم ، حتما در مورد وراثت در جاوا که در آموزش های قبلی توضیح دادیم، مطالعه کنید.
استفاده از کلمه کلیدی super
۱- برای فراخوانی متد های سوپر کلاس که در زیر کلاس قرار دارد.
۲- برای دستیابی به ویژگی ها (فیلد ها) سوپر کلاس اگر هر دو سوپر کلاس و زیر کلاس دارای ویژگی هایی با همین نام باشند.
۳- برای فراخوانی سازنده ی سوپر کلاس بدون آرگومان (پیش فرض) یا سازنده پارامتری به جای سازنده زیر کلاس.
بیایید هر یک از این کاربردها را درک کنیم.
۱- دسترسی به متد های overridden سوپر کلاس
اگر متد هایی هم نام در هر دو سوپر کلاس و زیر کلاس تعریف شود ، متد موجود در زیر کلاس متد سوپر کلاس را نادیده می گیرد که به آن method overriding می گویند.
مثال ۱ : method overriding
class Animal {
// overridden method
public void display(){
System.out.println(“I am an animal”);
}
}
class Dog extends Animal {
// overriding method
@Override
public void display(){
System.out.println(“I am a dog”);
}
public void printMessage(){
display();
}
}
class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.printMessage();
}
}
خروجی
I am a dog
در این مثال ، با ساختن شی dog1 از کلاس Dog ، می توانیم متد ()printMessage را صدا بزنیم که متد ()display را اجرا می کند.
از آنجا که ()display در هر دو کلاس تعریف شده است ، متد زیر کلاس Dog متد سوپر کلاس Animal را نادیده می گیرد. از این رو ، ()display زیر کلاس صدا زده می شود.
اگر متد فراخوانی سوپر کلاس ها فراخوانی شود چه می شود؟
در صورت نیاز به فراخوانی متد display در سوپر کلاس Animal از() super.display استفاده می کنیم.
مثال ۲ : فراخوانی متد سوپر کلاس
class Animal {
// overridden method
public void display(){
System.out.println(“I am an animal”);
}
}
class Dog extends Animal {
// overriding method
@Override
public void display(){
System.out.println(“I am a dog”);
}
public void printMessage(){
// this calls overriding method
display();
// this calls overridden method
super.display();
}
}
class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.printMessage();
}
}
خروجی
I am a dog
I am an animal
در اینجا ، چگونگی عملکرد برنامه بالا نشان داده شده است.
۲- دسترسی به متد های سوپرکلاس
سوپر کلاس و زیر کلاس می توانند متد های هم نام داشته باشند. ما از کلمه کلیدی super برای دسترسی به متد سوپر کلاس استفاده می کنیم.
مثال ۳ : به ویژگی سوپرکلاس دسترسی پیدا کنید
class Animal {
protected String type=”animal”;
}
class Dog extends Animal {
public String type=”mammal”;
public void printType() {
System.out.println(“I am a ” + type);
System.out.println(“I am an ” + super.type);
}
}
class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.printType();
}
}
هنگامی که برنامه را اجرا می کنیم ، خروجی برابر خواهد بود با:
I am a mammal
I am an animal
در این مثال ، ما فیلد type مشابهی را هم در سوپر کلاس Animal و هم در زیر کلاس Dog تعریف کرده ایم.
سپس یک شی dog1 از کلاس Dog ایجاد کردیم و متد ()printType را با استفاده از این شی صدا زدیم.
در داخل تابع ،()printType
- type به ویژگی زیر کلاس Dog بر می گردد.
- super.type به ویژگی سوپر کلاس Animal اشاره دارد.
را چاپ می کند System.out.println(“ I am a “ + type); عبارت I am a mammal در اینجا
و
System.out.println(“ I am an”+super.type); عبارت I am an animal
را چاپ می کند.
۳- استفاده از super() برای دسترسی به سازنده سوپرکلاس
همانطور که می دانیم، زمانی که شی ای از کلاس ایجاد می شود، به صورت اتوماتیک سازنده ی پیش فرض صدا زده می شود.
برای صدا زدن سازنده ی سوپرکلاس به جای سازنده ی زیر کلاس، از ()super استفاده می کنیم. (شکل ویژه ی کلید واژه ی super)
مثال ۴ : استفاده از ()super
class Animal {
// default or no-arg constructor of class Animal
Animal() {
System.out.println(“I am an animal”);
}
}
class Dog extends Animal {
// default or no-arg constructor of class Dog
Dog() {
// calling default constructor of the superclass
super();
System.out.println(“I am a dog”);
}
}
class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
}
}
خروجی
I am an animal
I am a dog
وقتی شی dog1 از کلاس Dog ساخته می شود، به صورت اتوماتیک سازنده ی پیش فرض یا بدون آرگومان کلاس را فراخوانی می کند.
داخل سازنده ی زیر کلاس، عبارت ()super سازنده ی سوپر کلاس را صدا می زند و دستورات داخل آن را اجرا می کند. در اینجا ما خروجی I am an animal را مشاهده می کنیم.
جریان برنامه سپس به سازنده زیر کلاس برمی گردد و دستورات باقی مانده را اجرا می کند. بنابراین ، I am a dog چاپ می شود.
استفاده از ()super اجباری نیست. حتی اگر از ()super در سازنده زیر کلاس استفاده نشده باشد ، کامپایلر بطور خودکار سازنده پیش فرض سوپر کلاس را صدا می کند.
اگر کامپایلر به طور خودکار ()super را فراخوانی می کند، چرا از کد های اضافه استفاده می کنیم؟
اگر سازنده پارامتری (سازنده ای که آرگومان می گیرد) سوپرکلاس را بخواهیم به جای سازنده زیر کلاس فرا بخوانیم ، لازم است.
()super پارامتری باید همیشه اولین جمله در بدنه سازنده زیر کلاس باشد ، در غیر این صورت خطای کامپایلر دریافت می کنیم.
مثال ۵ : فراخوانی سازنده ی پارامتری با استفاده از ()super
class Animal {
// default or no-arg constructor
Animal() {
System.out.println(“I am an animal”);
}
// parameterized constructor
Animal(String type) {
System.out.println(“Type: “+type);
}
}
class Dog extends Animal {
// default constructor
Dog() {
// calling parameterized constructor of the superclass
super(“Animal”);
System.out.println(“I am a dog”);
}
}
class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
}
}
خروجی
Type: Animal
I am a dog
کامپایلر می تواند اتوماتیک سازنده ی بدون آرگومان را صدا بزند. با این حال نمی تواند سازنده ی پارامتری را صدا بزند.
اگر سازنده ی پارامتری صدا زده شود، باید آن را صراحتا داخل زیر کلاس تعریف کرده باشیم.
توجه داشته باشید که در مثال بالا ، صریحاً سازنده پارامتری (super(“Animal” را صدا زدیم. کامپایلر در این حالت سازنده پیش فرض سوپر کلاس را صدا نمی کند.