ירושה בג'אווה הוא מנגנון שבו אובייקט אחד רוכש את כל התכונות וההתנהגויות של אובייקט אב. זה חלק חשוב של אופס (מערכת תכנות מונחה עצמים).
הרעיון מאחורי ירושה בג'אווה הוא שאתה יכול ליצור חדש שיעורים שבנויים על כיתות קיימות. כאשר אתה יורש ממחלקה קיימת, אתה יכול לעשות שימוש חוזר בשיטות ובשדות של מחלקת האב. יתר על כן, אתה יכול להוסיף שיטות ושדות חדשים גם בכיתה הנוכחית שלך.
ירושה מייצגת את מערכת יחסים IS-A אשר ידוע גם בשם א הורה-ילד מערכת יחסים.
למה להשתמש בירושה ב-Java
- ל עקיפת שיטה (כך פולימורפיזם בזמן ריצה ניתן להשגה).
- לשימוש חוזר בקוד.
מונחים המשמשים בירושה
התחביר של Java Inheritance
class Subclass-name extends Superclass-name { //methods and fields }
ה מרחיב את מילת המפתח מציין שאתה יוצר מחלקה חדשה הנובעת ממחלקה קיימת. המשמעות של 'מאריך' היא להגדיל את הפונקציונליות.
דוגמאות לקוד לדוגמה של javascript
בטרמינולוגיה של ג'אווה, מחלקה שעוברת בירושה נקראת הורה או מחלקה על, והמחלקה החדשה נקראת ילד או תת מחלקה.
דוגמה להורשה של Java
כפי שמוצג באיור לעיל, מתכנת הוא תת-הכיתה והעובד הוא מחלקת העל. הקשר בין שני הכיתות הוא מתכנת IS-A Employee . זה אומר שמתכנת הוא סוג של עובד.
q1 q2 q3 q4
class Employee{ float salary=40000; } class Programmer extends Employee{ int bonus=10000; public static void main(String args[]){ Programmer p=new Programmer(); System.out.println('Programmer salary is:'+p.salary); System.out.println('Bonus of Programmer is:'+p.bonus); } }בדוק את זה עכשיו
Programmer salary is:40000.0 Bonus of programmer is:10000
בדוגמה שלמעלה, אובייקט מתכנת יכול לגשת לשדה של מחלקה משלו כמו גם של מחלקה Employee, כלומר שימוש חוזר בקוד.
סוגי ירושה ב-Java
על בסיס מחלקה, יכולים להיות שלושה סוגים של ירושה ב-Java: יחיד, רב-שכבתי והיררכי.
בתכנות ג'אווה, ירושה מרובה והיברידית נתמכת באמצעות ממשק בלבד. על ממשקים נלמד בהמשך.
הערה: ירושה מרובה אינה נתמכת ב-Java דרך הכיתה.
כאשר מחלקה אחת יורשת מחלקות מרובות, זה ידוע בתור ירושה מרובה. לדוגמה:
דוגמה בירושה בודדת
כאשר מחלקה יורשת מחלקה אחרת, היא ידועה בשם א ירושה בודדת . בדוגמה המופיעה להלן, מחלקת הכלב יורשת את מחלקת החיה, כך שישנה הירושה הבודדת.
פקודת הפעלה של לינוקס
קובץ: TestInheritance.java
class Animal{ void eat(){System.out.println('eating...');} } class Dog extends Animal{ void bark(){System.out.println('barking...');} } class TestInheritance{ public static void main(String args[]){ Dog d=new Dog(); d.bark(); d.eat(); }}
תְפוּקָה:
barking... eating...
דוגמה להורשה רב-שכבתית
כאשר יש שרשרת של ירושה, זה ידוע בשם ירושה רב-שכבתית . כפי שניתן לראות בדוגמה המובאת למטה, מחלקה BabyDog יורשת את המחלקה Dog אשר שוב יורשת את המחלקה Animal, כך שישנה ירושה רב-שכבתית.
קובץ: TestInheritance2.java
class Animal{ void eat(){System.out.println('eating...');} } class Dog extends Animal{ void bark(){System.out.println('barking...');} } class BabyDog extends Dog{ void weep(){System.out.println('weeping...');} } class TestInheritance2{ public static void main(String args[]){ BabyDog d=new BabyDog(); d.weep(); d.bark(); d.eat(); }}
תְפוּקָה:
weeping... barking... eating...
דוגמה להורשה היררכית
כאשר שתי מחלקות או יותר יורשות מחלקה בודדת, היא ידועה בשם ירושה היררכית . בדוגמה המובאת להלן, כיתות כלב וחתול יורשות את מחלקת החיות, כך שיש ירושה היררכית.
קובץ: TestInheritance3.java
10 מתוך 50.00
class Animal{ void eat(){System.out.println('eating...');} } class Dog extends Animal{ void bark(){System.out.println('barking...');} } class Cat extends Animal{ void meow(){System.out.println('meowing...');} } class TestInheritance3{ public static void main(String args[]){ Cat c=new Cat(); c.meow(); c.eat(); //c.bark();//C.T.Error }}
תְפוּקָה:
meowing... eating...
ש) מדוע ירושה מרובה אינה נתמכת ב-java?
כדי להפחית את המורכבות ולפשט את השפה, ירושה מרובה אינה נתמכת ב-java.
שקול תרחיש שבו A, B ו-C הם שלוש מחלקות. מחלקה C יורשת את מחלקות A ו-B. אם למחלקות A ו-B יש אותה שיטה ואתה קורא לה מ- child class object, תהיה אי בהירות לקרוא לשיטה של מחלקה A או B.
מכיוון ששגיאות זמן הידור עדיפות משגיאות זמן ריצה, Java מעבד שגיאות זמן הידור אם אתה יורש 2 מחלקות. אז בין אם יש לך אותה שיטה או שונה, תהיה שגיאת זמן קומפילציה.
class A{ void msg(){System.out.println('Hello');} } class B{ void msg(){System.out.println('Welcome');} } class C extends A,B{//suppose if it were public static void main(String args[]){ C obj=new C(); obj.msg();//Now which msg() method would be invoked? } }בדוק את זה עכשיו
Compile Time Error