3 سال پیش / خواندن دقیقه

کلاس ها و متدهای abstract (انتزاعی) در جاوا با مثال

کلاس ها و متدهای abstract (انتزاعی) در جاوا با مثال

در این آموزش با انتزاعی سازی در جاوا آشنا می شوید و در مورد کلاس ها و متد های abstract جاوا و نحوه استفاده از آن ها در برنامه یاد خواهید گرفت.

کلاس abstract جاوا

کلاس انتزاعی کلاسی است که نمی توان آن را معرفی کرد (نمی توانیم از کلاس انتزاعی شی ایجاد کنیم). در جاوا از کلمه کلیدی abstract برای تعریف کلاس انتزاعی استفاده می کنیم.

abstract class Animal {
//attributes and methods
}


اگر سعی کنیم از کلاس انتزاعی شی ایجاد کنیم ، کامپایلر خطا می گیرد. مثلا :

Animal a1 = new Animal()


که خطای کامپایلر ایجاد می کند:

Animal is abstract; cannot be instantiated

گرچه کلاس های انتزاعی را نمی توان تعریف کرد ، اما می توانیم از آن ها زیر کلاس و از زیر کلاس برای دسترسی به اعضای کلاس انتزاعی، شی ایجاد کنیم.

قبل از اینکه به طور مفصل در مورد آن ها صحبت کنیم ، باید متد های انتزاعی را درک کنیم.

متد abstract جاوا

ما برای ایجاد متد های انتزاعی از همان کلمه کلیدی abstract استفاده می کنیم. یک متد انتزاعی بدون اجرا تعریف می شود. مثلا:

  1. abstract void makeSound();

در اینجا ، ()makeSound متد انتزاعی است. بدنه ی ()makeSound با ; جایگزین شده است.

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

کلاس انتزاعی می تواند شامل هر دو متد انتزاعی و غیر انتزاعی باشد. به مثال زیر توجه کنید:

abstract class Animal {
public void displayInfo() {
System.out.println(“I am an animal.”);
}
abstract void makeSound();
}

در مثال بالا ، ما یک کلاس انتزاعی Animal ایجاد کردیم که شامل یک متد انتزاعی ()makeSound و یک متد غیر انتزاعی ()displayInfo است.

وراثت از کلاس abstract

کلاس انتزاعی را نمی توان معرفی کرد. برای دسترسی به اعضای یک کلاس انتزاعی ، باید از آن ارث بری کنیم.

مثال ۱ : وراثت از کلاس abstract

abstract class Animal {
public void displayInfo() {
System.out.println(“I am an animal.”);
}
}
class Dog extends Animal {
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.displayInfo();
}
}

خروجی

I am an animal.

در مثال بالا ، ما یک کلاس انتزاعی Animal ایجاد کردیم. ولی نمی توانیم از Animal شی ایجاد کنیم. برای دسترسی به ()displayInfo،یک زیر کلاس Dog از Animal ایجاد کردیم.( از کلاس Animal ارث بری کرده است)

سپس از شیء d1 از Dog برای دسترسی به متد ()displayInfo استفاده کردیم.

Overriding (پیاده سازی مجدد متد های ارث برده شده ) متد های انتزاعی

در جاوا ، Overriding متد های انتزاعی سوپرکلاس در زیر کلاس اجباری است. زیرا زیر کلاس متد های انتزاعی سوپر کلاس را به ارث می برد.

از آنجا که زیر کلاس شامل متد های انتزاعی است ، باید آنها را پیاده سازی مجدد کنیم.

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

مثال ۲ : Overriding متد انتزاعی

abstract class Animal {
abstract void makeSound();
public void eat() {
System.out.println(“I can eat.”);
}
}
class Dog extends Animal {
public void makeSound() {
System.out.println(“Bark bark”);
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.makeSound();
d1.eat();
}
}

خروجی

Bark bark.

I can eat.

در مثال بالا ، کلاس انتزاعی Animal ایجاد کرده ایم. این کلاس شامل یک متد انتزاعی ()makeSound و یک متد غیر انتزاعی ()eat است.

زیر کلاس Dog از سوپر کلاس Animal ارث بری کرده است. در اینجا ، زیر کلاس Dog متد انتزاعی ()displayInfo را پیاده سازی مجدد کرده است.

سپس یک شیء d1 از Dog ایجاد کردیم. با استفاده از شی ، متدهای ()d1.displayInfo و ()d1.eat را فراخوانی کردیم.

دسترسی به سازنده کلاس های انتزاعی

مشابه کلاس های غیر انتزاعی ، با استفاده از کلمه کلیدی super به سازنده یک کلاس انتزاعی در زیر کلاس دسترسی پیدا می کنیم. مثلا،

abstract class Animal {
Animal() {
….
}
}
class Dog extends Animal {
Dog() {
super();
…
}
}

در اینجا ، از ()super در سازنده Dog برای دسترسی به سازنده Animal استفاده کرده ایم.

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

چرا انتزاعی سازی جاوا ؟

انتزاع یک مفهوم مهم برنامه نویسی شی گرا است. انتزاع فقط اطلاعات مورد نیاز را نشان می دهد و تمام جزئیات غیر ضروری پنهان نگه داشته می شوند. این کار به ما امکان می دهد پیچیدگی را با حذف یا پنهان کردن جزئیات با یک ایده ساده تر و سطح بالاتر مدیریت کنیم.

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

مهمترین مزیت مخفی کردن کار ترمز این است که اکنون سازنده می تواند ترمز را به صورت متفاوتی برای موتورهای مختلف پیاده سازی کند ، با این حال ، آنچه ترمز انجام می دهد یکسان است.

بیایید مثالی بزنیم که به ما در درک بهتر انتزاع جاوا کمک کند.

مثال ۳ : انتزاع جاوا

abstract class Animal {
abstract void makeSound();
}
class Dog extends Animal {
public void makeSound() {
System.out.println(“Bark bark.”);
}
}
class Cat extends Animal {
public void makeSound() {
System.out.println(“Meows “);
}
}
class Main {
public static void main(String[] args) {
Dog d1 = new Dog();
d1.makeSound();
Cat c1 = new Cat();
c1.makeSound();
}
}

خروجی

Bark bark

Meows

در مثال بالا ، یک سوپرکلاس Animal ایجاد کرده ایم. Animal متد انتزاعی ()makeSound را دارد.

متد ()makeSound در Animal قابل اجرا نیست. به این دلیل که هر حیوانی صداهای متفاوتی ایجاد می کند. بنابراین ، کلیه زیر کلاس های Animal اجرای متفاوتی از ()makeSound دارند.

نمی توانیم ()makeSound را در Animal به گونه‌ای اجرا کنیم که بتواند برای کلیه زیر کلاس های آن درست باشد. بنابراین ، اجرای ()makeSound در Animal مخفی نگه داشته می شود.

در مثال بالا ، Dog اجرای خود را از ()makeSound انجام می دهد و Cat اجرای خاص خود را از ()makeSound انجام می دهد.

نکات کلیدی برای یادآوری

  • از کلمه کلیدی abstract برای ایجاد کلاس ها و متد های انتزاعی استفاده می کنیم.
  • یک متد انتزاعی هیچ پیاده سازی (بدنه متد) ندارد.
  • کلاس حاوی متد های انتزاعی نیز باید انتزاعی باشد.
  • نمی توانیم از کلاس انتزاعی شی ایجاد کنیم.
  • برای پیاده سازی ویژگی های یک کلاس انتزاعی ، زیر کلاس ها از آن ارث می برند و از زیر کلاس شی ایجاد می کنیم.
  • یک زیر کلاس باید تمام متد های انتزاعی یک کلاس انتزاعی را نادیده بگیرد (پیاده سازی مجدد انجام دهد). اما اگر زیر کلاس انتزاعی تعریف شود ، نادیده گرفتن متد های انتزاعی اجباری نیست.
  • می توانیم با استفاده از مرجع کلاس انتزاعی به ویژگی ها و متد های استاتیک یک کلاس انتزاعی دسترسی پیدا کنیم. مثلا :
Animal.staticMethod();


شاید از نوشته‌های زیر خوشتان بیاید
نظر خود را درباره این پست بنویسید ...

منوی سریع