همانطور که در جلسات پیش دیدیم، امکان اورلود متدها با تغییر نوع داده بازگشتی وجود ندارد اما این امکان در رابطه با اورراید وجود دارد. تا قبل از جاوا 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 می باشد و متد اورراید اتفاق افتاده است.
در حالی که جاوا اجازه متد اورلودینگ بر اساس تغییر نوع داده بازگشتی را نمی دهد، JVM همیشه این شرایط را فراهم می کند. در واقع JVM امضای کامل یک متد را که شامل آرگومانها، نوع داده بازگشتی و غیره می باشد را بررسی و جستجو می کند و javac با استفاده از همین امکان، نوع خروجی Covariant را پیاده سازی می کند.
کلمه کلیدی super در واقع یک متغیر رفرنسی است که که برای اشاره به کلاس والد (اولین والد) مورد استفاده قرار میگیرد.
در واقع موقع ساخت یک کلاس فرزند، به طور ضمنی کلاس پدر با کلمه کلیدی super ساخته می شود.
موارد استفاده از super
در صورتی که بخواهیم به فیلد و اطلاعات موجود در کلاس پدر دسترسی داشته باشیم از کلمه کلیدی 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 می باشند.
مشابه مورد قبل است تنها تفاوت در اینجاست که متد صدا زده میشود. در صورتی که کلاس فرزند، دارای متد همنام کلاس پدر باشد (اورراید کرده باشد) آنگاه از کلمه کلیدی 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...
دقت کنید که در مواردی که هر دو کلاس پدر و فرزند، یک متد همنام داشته باشند، آنگاه متد کلاس فرزند صدا زده می شود زیرا اولویت با کلاس فرزند می باشد.
از کلمه کلیدی 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
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.