فصل 17: نوع خروجی Covariant و کلمه کلیدی super در جاوا

28 مرداد 1397
java-super-keyword

همانطور که در جلسات پیش دیدیم، امکان اورلود متدها با تغییر نوع داده بازگشتی وجود ندارد اما این امکان در رابطه با اورراید وجود دارد. تا قبل از جاوا 5، امکان اورراید متدها با تغییر نوع داده بازگشتی وجود نداشت اما اکنون می توان با تغییر نوع داده بازگشتی اینکار را انجام داد به شرطی که نوع داده های بازگشتی اولیه یا Primitive نباشد و نوع داده بازگشتی کلاس فرزند، از کلاس پدر ارث‌بری کرده باشد.

دقت کنید که این مفهوم اصلا برای کسانی که به تازگی شروع به یادگیری جاوا کرده‌اند، کاربردی نیست.

مثال:

class A{  
A get(){return this;}  
}  
  
class B1 extends A{  
B1 get(){return this;}  
void message(){System.out.println("welcome to covariant return type");}  
  
public static void main(String args[]){  
new B1().get().message();  
}  
}

خروجی:

Output:welcome to covariant return type

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

نوع خروجی Covariant چگونه پیاده سازی می شود؟

در حالی که جاوا اجازه متد اورلودینگ بر اساس تغییر نوع داده بازگشتی را نمی دهد، JVM همیشه این شرایط را فراهم می کند. در واقع JVM امضای کامل یک متد را که شامل آرگومان‌ها، نوع داده بازگشتی و غیره می باشد را بررسی و جستجو می کند و javac با استفاده از همین امکان، نوع خروجی Covariant را پیاده سازی می کند.

کلمه کلیدی Super در جاوا

کلمه کلیدی super در واقع یک متغیر رفرنسی است که که برای اشاره به کلاس والد (اولین والد) مورد استفاده قرار میگیرد.

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

موارد استفاده از super

  1. برای اشاره به اولین کلاس پدر مورد استفاده قرار میگیرد.
  2. برای صدا زدن اولین کلاس پدر استفاده می شود.
  3. Super() برای صدا زدن کانستراکتور اولین کلاس پدر استفاده می شود.

1- اشاره به اولین کلاس پدر

در صورتی که بخواهیم به فیلد و اطلاعات موجود در کلاس پدر دسترسی داشته باشیم از کلمه کلیدی 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

به عنوان مثال همانطور که در مثال بالا می بینید. هر دو کلاس دارای فیلدی به نام color می باشند.

2- صدا زدن کلاس پدر

مشابه مورد قبل است تنها تفاوت در اینجاست که متد صدا زده میشود. در صورتی که کلاس فرزند، دارای متد همنام کلاس پدر باشد (اورراید کرده باشد) آنگاه از کلمه کلیدی 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...

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

3- صدا زدن کانستراکتور کلاس پدر

از کلمه کلیدی 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
نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.