English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
فيُ هذاُ الدليلُ،ُ سنُتعلمُ عنُ الوراثةُ فيُ Javaُ باستخدامُ الأمثلةُ.
الوراثةُ هيُ واحدةُ منُ الميزاتُ المهمةُ فيُ OOP (برمجةُ الموجهةُ للأشياء)،ُ وتُمكنُناُ منُ تعريفُ فئةُ جديدةُ منُ الفئاتُ الموجودةُ مسبقًا.
classُ Animal )} //ُ methodُ eat()ُ //ُ methodُ sleep()ُ } classُ Dogُ extendsُ Animal )} // طريقة bark() }
في Java، نستخدم الكلمة المفتاح extends للوراثة من فئة. هنا، نرث فئة Dog من فئة Animal
Animal هي فئة أم (فئة آباء أو أساسية)، وDog هي فرعية (فئة فرعية أو مكتسبة). تنقل الفرعية أقل الفئات حقلين وطرق.
الوراثة هي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 bark
في هذا السياق، نرث فرعية Dog من فئة父 Animal. Dog يرث طرق eat() وsleep() من فئة Animal
لذلك، يمكن للعناصر من فئة Dog الوصول إلى أعضاء فئة Dog وفئة Animal
لقد تعرفنا في درس سابق على معدلات الوصول private وpublic
يمكن الوصول إلى الأعضاء private فقط داخل الفئة
يمكن الوصول إلى الأعضاء public من أي مكان
يمكنك أيضًا تعيين طرق وأ成员 كprotected، يمكن الوصول إلى الأعضاء المحميين
داخل الفئة
في فرعية
في نفس المجموعة
هذا هو مختصر يمكن الوصول إلى معدلات الوصول.
معدل | فئة | مجموعة | فرعي | عالمي |
---|---|---|---|---|
public | نعم | نعم | نعم | نعم |
private | نعم | لا | لا | لا |
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("أنا " + type); System.out.println("لوني " + 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 bark أنا حيوان لوني أسود
في هذا السياق، الحقل نوع في فئة Animal محمي. لقد أتممنا الوصول إلى هذا الحقل من فئة Main
dog1.type = "mammal";
هذا ممكن لأن كلاً من 类 Animal و Main توجدان في نفس الملف (نفس المجموعة).
من خلال المثال السابق، نعلم أن كائن الفئة الفرعية يمكنه الوصول إلى طرق الفئة الأصلية.
ماذا سيحدث إذا تم تعريف نفس الطريقة في الفئة الأصلية والفئة الفرعية؟
حسنًا، في هذه الحالة، سيقوم الطريقة في الفئة الفرعية بتعديل الطريقة في الفئة الأصلية. على سبيل المثال،
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 can bark
في هذا المكان، تظهر طريقة eat() في الفئة الأصلية Animal والفئة الفرعية Dog. أنشأنا كائن فرعي Dog dog1.
عندما نستدعي طريقة eat() باستخدام كائن dog1، سيتم استدعاء الطريقة الموجودة في Dog بدلاً من الطريقة الموجودة في الفئة الأصلية. هذا يُسمى تعديل الطريقة.
في البرنامج المذكور أعلاه، استخدمنا تعليق @Override لتخبر محرر البرنامج أننا نقوم بتعديل الطريقة. ولكن هذا ليس إلزاميًا. سنقوم بدراسة المزيد في الدرس القادمتعديل الطريقة.
إذا كنت بحاجة إلى استدعاء طريقة eat() من فئة Animal الفرعية، استخدم كلمة المفتاح 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 can bark
في هذا المثال، استخدمنا كلمة المفتاحية super لاستدعاء مكونات الكود باستخدام super() لاستدعاء مكونات الكود باستخدام super.eat() لاستدعاء مكونات الكود باستخدام طريقة eat() من الفئة Animal الأب.
ملاحظة: الفرق بين استدعاء مكونات الكود عند استدعاء مكونات الكود عند استدعاء مكونات الكود باستخدام super عند استدعاء مكونات الكود باستخدام super. للحصول على معلومات إضافية، يرجى زيارةكلمة المفتاحية Java super.
هناك خمس أنواع من النسب.
النسب الواحدة - الفئة B تنسب فقط من الفئة A.
النسب المتعددة المستويات - الفئة B تنسب من الفئة A، ثم الفئة C تنسب من الفئة B.
النسب الهرمية - الفئة A كأب للفئات B، C و D.
النسب المتعددة - الفئة C من خلال واجهة A وتوسيع B.
النسب المختلطة - إثنين أو أكثرالنسبية.النسب.
النسب المختلطة.
لماذا نستخدم النسب؟
أهم استخداماته هو إعادة استخدامه في الكود. لا تحتاج إلى كتابة الكود الموجود في الفئة الأب في الفئة الفرعية.