الوراثة في Java
ابنِ نوعًا فرعيًا بـ extends ليستخدم متدًا مكتوبًا على الأب. ضع horn على Car ليطبع beep. اكتب class Truck extends Car. في Yard.java أنشئ Truck ونفّذ t.horn(). ترجم بـ javac Yard.java وشغّل java Yard. يجب أن تُظهر الشاشة beep. عرض ثانٍ يبني Carًا عاديًا لتري أن الأب ما زال يعمل بعد وجود الفرع. اترك super للصفحة التالية. لا تعيد كتابة horn على Truck في هذه الصفحة — إعادة التعريف لاحقًا.
الفرع يحتفظ بمتد الأب
صفحة المسارات سمّت الأماكن بـ Paths.get. هذه الصفحة تبدأ وحدة جديدة: صنف واحد يمكن أن يكون فرعًا لآخر. افتح ملفًا تعليميًا باسم Yard.java. أبقِ اسم الصنف العام Yard ليطابق اسم الملف. احذف عروض مسار Route المتبقية، وكتابات Store، وماسحات Reader، وأي Scanner للوحة المفاتيح. لا ينتظر البرنامج الكتابة. لا تحتاج سطر import في هذا الدرس.
فوق الصنف العام، أعلن نوع الأب package-private:
class Car {
داخل Car اكتب متد نموذج void horn() يطبع beep:
System.out.println("beep");
ثم أعلن الفرع:
class Truck extends Car {
أبقِ جسم Truck فارغًا في هذه الصفحة. الفرع لا يعيد كتابة horn. الأقواس الفارغة تكفي لتقول إن Truck نوع من Car.
داخل Yard.main أنشئ شاحنة ونفّذ المتد الموروث:
Truck t = new Truck();
t.horn();
الاستدعاء ينجح لأن extends Car يربط Truck بـ Car. أنت لم تنسخ horn داخل Truck.
class Car {
void horn() {
System.out.println("beep");
}
}
class Truck extends Car {
}
public class Yard {
public static void main(String[] args) {
Truck t = new Truck();
t.horn();
}
}
من المجلد الذي يحوي Yard.java شغّل javac Yard.java. عندما تتطابق الأقواس والفواصل المنقوطة، لا يكتب javac سطرًا خاصًا به. ثم شغّل java Yard — وليس java Yard.java. اترك لاحقة .java خارج أمر التشغيل. يوجد صنف عام واحد فقط في هذا الملف، فيطابق اسم الملف Yard. الأصناف المساعدة Car وTruck تبقى بلا public في هذا الشكل للمبتدئين. وضع ثلاثة أصناف عامة في ملف واحد يجعل javac يرفض — احتفظ بقاعدة صفحة الأصناف.
الشاشة تُظهر beep. امشِ التشغيل مرة. يبدأ Java من Yard.main. new Truck() يبني كائن شاحنة. t.horn() يجد horn على الأب Car عبر الوراثة. المتد يطبع beep. إذا قال javac إنه لا يجد horn على Truck، فسطر extends Car ناقص أو مكتوب خطأ — أعده. إذا رأيت note.txt أو طباعة مسار، فبقايا Route ما زالت تعمل — انتقل إلى java Yard. إذا انتظر الطرفية الكتابة، فبقايا Scanner للوحة المفاتيح ما زالت في الملف — احذفها.
اكتب extends بعناية. فاصلة أو كلمة implements خاطئة ليست هذا الدرس. الوراثة هنا هي كلمة extends بين اسم الفرع والأب. اسم الفرع يأتي أولًا: Truck extends Car، وليس العكس.
لا تكتب super في هذه الصفحة. استدعاء منشئ الأب بـ super هو الدرس التالي. لا تكتب horn ثانيًا داخل Truck أيضًا؛ قصة إعادة التعريف لاحقًا. اليوم يبقى الفرع فارغًا ويستخدم متد الأب. ذلك الجسم الفارغ تعليم متعمد، وليس خطأ تُصلحه بنسخ horn إلى Truck.
📊 Parent and child on this page
| Piece | Role |
|---|---|
| Car | parent type that owns horn |
| Truck | child type via extends Car |
| Yard | public starter with main |
| horn | prints beep; written only on Car |
الأب ما زال يعمل وحده
برنامج ثانٍ يحتفظ بنفس Car، ونفس Truck extends Car الفارغ، ونفس Yard العام. داخل main أنشئ Car وTruck معًا ونفّذ horn على كل منهما.
class Car {
void horn() {
System.out.println("beep");
}
}
class Truck extends Car {
}
public class Yard {
public static void main(String[] args) {
Car c = new Car();
Truck t = new Truck();
c.horn();
t.horn();
}
}
ترجم بـ javac Yard.java، ثم شغّل java Yard. الشاشة تُظهر beep، ثم beep مرة أخرى. السطر الأول من Car العادي. الثاني من Truck الذي ورث horn. إنشاء فرع لم يحذف الأب ولم يكسره. يمكن لكلا الكائنين استدعاء نفس جسم المتد المكتوب مرة على Car. ما زلت تبني كل كائن بنفسك بـ new؛ سطر extends لا ينشئ شاحنة تلقائيًا.
هذا التباين هو نقطة التفتيش. الوراثة تضيف مسارًا فرعيًا لمتد موجود. لا تلزمك إزالة الأب. إذا أزلت extends Car من Truck، يفشل t.horn() في الترجمة لأن Truck لم يعد يستلم horn. احتفظ بـ extends للفرع التعليمي. فضّل ملف الشاحنة الواحدة عندما تريد beep هادئًا واحدًا. فضّل ملف الكائنين عندما تريد إثبات أن الأب ما زال يجيب.
مقارنة مع المسارات على Route
في صفحة المسارات، java Route سمّى مجلدات وملفات. في هذه الصفحة، java Yard يربط الأصناف بـ extends. احتفظ بملفات Route كتاريخ فقط إن بقيت قريبة؛ شغّل java Yard لعروض الوراثة لتطابق الشاشة هذا الدرس.
extends، إعادة استخدام متد الأب، وجسم فرع فارغ هي الرموز الجديدة. أنت تعرف بالفعل new ومتدهات النموذج من صفحات OOP السابقة. اليوم تلتقي تلك القطع بالوراثة لأول مرة في مسار هذه الدورة. أبقِ أسماء التعليم Car وTruck وYard قصيرة وواضحة لأوامر الترجمة والتشغيل.
ما تتركه هذه الصفحة لـ super
هذه الصفحة تُظهر فرعًا يستخدم متد الأب دون كتابة super. الصفحة التالية تقدّم super ليتصل الفرع بالأب عمدًا، خاصة حول المنشئين. ابقَ على extends واستدعاء horn الموروث هنا. لا تضف super() كمتطلب على عروض Yard هذه بعد.
قبل super
يمكنك كتابة Truck extends Car، وبناء Truck، ورؤية beep من horn. يمكنك أيضًا بناء Car عادي ورؤية الأب ما زال يطبع beep. ترجم Yard.java وشغّل java Yard لكل عرض محفوظ بالتتابع. بقي الفرع فارغًا واستخدم متد الأب. الصفحة التالية هي super، حيث يتحدث الفرع مع الأب مباشرة أكثر.
احتفظ بعرض الشاحنة الواحدة لاستدعاء موروث واضح. احتفظ بعرض الكائنين لإثبات أن الأب يعمل وحده. أبقِ super بعيدًا عن هذه الصفحة الآن. هذه العادات الثلاث نقطة تفتيش قبل المتابعة. عندما يظهر beep من Truck لم يكتب horn الخاص به، فقد أنجزت الوراثة عملها في هذا الدرس وأنت جاهز لموضوع super التالي.
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى