آموزش وراثت در جاوا (به زبان کاملا ساده)
در این آموزش شما با کمک مثال ، وراثت در جاوا را یاد خواهید گرفت.
وراثت یکی از ویژگیهای اصلی OOP (برنامه نویسی شی گرا) است که به ما امکان می دهد کلاس جدیدی را از یک کلاس موجود تعریف کنیم. مثلا،
- class Animal
- {
- // eat() method
- // sleep() method
- }
- class Dog extends Animal
- {
- // bark() method
- }
در جاوا ، ما از کلمه کلیدی extends برای ارث بردن از یک کلاس استفاده می کنیم. در اینجا ، کلاس Dog از کلاس Animal ارث بری کرده است.
Animal سوپر کلاس (کلاس والد یا کلاس پایه) و Dog یک زیر کلاس (کلاس فرزند یا کلاس مشتق) است. زیر کلاس ویژگی ها و متد ها را از سوپر کلاس به ارث می برد.
توجه به این نکته حائز اهمیت است که فقط آن دسته از اعضایی که قابل مشاهده (در دسترس) هستند، توسط کلاس فرعی به ارث برده می شوند.
رابطه is-a
وراثت یک رابطه ی is-a است. فقط درصورتی که رابطه is-a بین دو کلاس وجود داشته باشد ، از ارث بری استفاده می کنیم.
در اینجا چند مثال آورده شده است:
- ماشین وسیله نقلیه است.
- یک پرتقال یک میوه است.
- جراح پزشک است.
- سگ حیوان است.
مثال ۱ : وراثت در جاوا
- class Animal {
- public void eat() {
- System.out.println(“I can eat”);
- }
- public void sleep() {
- System.out.println(“I can sleep”);
- }
- }
- class Dog extends Animal {
- public void bark() {
- System.out.println(“I can bark”);
- }
- }
- class Main {
- public static void main(String[] args) {
- Dog dog1 = new Dog();
- dog1.eat();
- dog1.sleep();
- dog1.bark();
- }
- }
خروجی
I can eat
I can sleep
I can bark
در اینجا ، ما کلاس Dog را از سوپر کلاس Animal به ارث برده ایم. کلاس Dog متد های ()eat()، sleep را از کلاس Animal به ارث می برد.
از این رو ، اشیاء کلاس Dog می توانند متدهای کلاس Dog و کلاس Animal را فراخوانی کنند.
مثال ۲ : کلید واژه ی protected
- class Animal {
- protected String type;
- private String color;
- public void eat() {
- System.out.println(“I can eat”);
- }
- public void sleep() {
- System.out.println(“I can sleep”);
- }
- public String getColor(){
- return color;
- }
- public void setColor(String col){
- color = col;
- }
- }
- class Dog extends Animal {
- public void displayInfo(String c){
- System.out.println(“I am a ” + type);
- System.out.println(“My color is ” + c);
- }
- public void bark() {
- System.out.println(“I can bark”);
- }
- }
- class Main {
- public static void main(String[] args) {
- Dog dog1 = new Dog();
- dog1.eat();
- dog1.sleep();
- dog1.bark();
- dog1.type = “mammal”;
- dog1.setColor(“black”);
- dog1.displayInfo(dog1.getColor());
- }
- }
خروجی
I can eat
I can sleep
I can bark
I am a mammal
My color is black
در مثال بالا ، کلاس Animal ویژگی color را دارد که خصوصی است. از این رو ، فقط در Animal قابل مشاهده است. بنابراین ، زیر کلاس Dog نمی تواند آن را به ارث ببرد.
برای دسترسی به ویژگی color ، از متدهای عمومی ()getColor و ()setColor در داخل سوپرکلاس Animal استفاده کرده ایم.
جاوا، جاوا اسکریپت رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی عالی با توسعه وب، ماشین لرنینگ و ... کتابخانه های پیشرفته جاوا اسکریپت و ... دانلود:
همچنین ، به کلمه کلیدی protected توجه کنید. protected درست مانند public و private یک تنظیم کننده سطح دسترسی است.
اعضای protected همچنین در یک پکیج و زیر کلاس قابل مشاهده هستند. در مثال بالا ، سوپرکلاس Animal دارای ویژگی type است که به عنوان protected اعلام شده است. از این رو ، زیر کلاس Dog می تواند به آن دسترسی پیدا کند.
متد overriding
از مثال های فوق دریافتیم که اشیاء یک زیر کلاس می توانند به متد های سوپر کلاس دسترسی پیدا کنند و همچنین متد های خاص خود را تعریف کنند.
چه اتفاقی می افتد اگر همان متد در هر دو سوپرکلاس و زیر کلاس تعریف شود؟
خوب در این حالت متد های موجود در زیر کلاس متد های موجود در سوپر کلاس را رد می کنند. مثلا،
مثال ۳ : مثال متد overriding
- class Animal {
- protected String type = “animal”;
- public void eat() {
- System.out.println(“I can eat”);
- }
- public void sleep() {
- System.out.println(“I can sleep”);
- }
- }
- class Dog extends Animal {
- @Override
- public void eat() {
- System.out.println(“I eat dog food”);
- }
- public void bark() {
- System.out.println(“I can bark”);
- }
- }
- class Main {
- public static void main(String[] args) {
- Dog dog1 = new Dog();
- dog1.eat();
- dog1.sleep();
- dog1.bark();
- }
- }
خروجی
I eat dog food
I can sleep
I can bark
در اینجا ، متد ()eat هم در سوپر کلاس Animal و هم زیر کلاس Dog وجود دارد. شی dog1 را از زیر کلاس Dog ایجاد کردیم.
وقتی متد ()eat را با استفاده از شی dog1 صدا می زنیم ، متد داخل کلاس Dog صدا زده می شود و متد سوپر کلاس صدا زده نمی شود. این کار اصطلاحا متد overriding نامیده می شود.
در برنامه بالا ، ما از متد overriding استفاده کرده ایم تا به کامپایلر بگوییم که در حال غلبه بر متدی هستیم. با این حال ، اجباری نیست.
اگر ما نیاز به فراخوانی متد ()eat از Animal از زیر کلاس Dog داریم ، از کلمه کلیدی super استفاده می کنیم.
مثال ۴ : کلمه کلیدی super
- class Animal {
- public Animal() {
- System.out.println(“I am an Animal”);
- }
- public void eat() {
- System.out.println(“I can eat”);
- }
- }
- class Dog extends Animal {
- public Dog(){
- super();
- System.out.println(“I am a dog”);
- }
- @Override
- public void eat() {
- super.eat();
- System.out.println(“I eat dog food”);
- }
- public void bark() {
- System.out.println(“I can bark”);
- }
- }
- class Main {
- public static void main(String[] args) {
- Dog dog1 = new Dog();
- dog1.eat();
- dog1.bark();
- }
- }
خروجی
I am an Animal
I am a dog
I can eat
I eat dog food
I can bark
در اینجا ، ما از کلمه کلیدی super برای صدا زدن سازنده با استفاده از ()super استفاده کرده ایم. همچنین ، با استفاده از ()super.eat از متد ()eat سوپرکلاس Animal استفاده کرده ایم.
هنگام استفاده از سازنده و متد ، به تفاوت استفاده از super توجه کنید.
انواع وراثت
۵ نوع ارث بری وجود دارد:
- وراث منفرد – کلاس B فقط از کلاس A ارث بری می کند.
- وراثت چند سطحی – کلاس B از کلاس A ارث بری می کند، سپس کلاس C از کلاس B ارث بری می کند.
- وراثت سلسله مراتبی – کلاس A به عنوان ابر کلاس برای کلاس های B ، C و D عمل می کند.
- وراثت چندگانه – کلاس C از اینترفیس های A و B ارث بری می کند.
- وراثت ترکیبی – ترکیبی از دو یا چند نوع ارث بری.
جاوا از ارث بری چندگانه و ترکیبی از طریق کلاس پشتیبانی نمی کند. اما می توان با کمک اینترفیس ها از آن استفاده کرد.
چرا از ارث بری استفاده می کنیم؟
مهمترین کاربرد، قابلیت استفاده مجدد از کد است. کدی که در کلاس والد وجود دارد نیاز به نوشتن مجدد در کلاس فرزند ندارد.
یکی دیگر از کاربردها ، استفاده از متد overriding است به گونه ای که می توان به چند ریختی زمان اجرا دست یافت.
ممنون از مطالب مفیدی که در اختیار ما گذاشتین 3>
پاسخ