إعادة التعريف في Java
أعد كتابة متد الأب على الابن حتى يستخدم الاستدعاء بدنة الابن. أبقِ Truck extends Car. على Car أبقِ horn يطبع beep. على Truck اكتب horn مجددًا ليطبع honk. في Yard.java ابنِ Truck واستدعِ t.horn(). ترجم بـ javac Yard.java وشغّل java Yard. يجب أن تُظهر الشاشة honk. عرض ثانٍ يبني أيضًا Car بسيطًا لتسمع beep من الأب وhonk من الابن. اترك الواجهات للصفحة التالية — هذا الدرس اسم متد واحد ببدنتين.
أعد كتابة horn على الابن
صفحة الوراثة تركت Truck فارغًا فبقي t.horn() على beep الأب. صفحة super شغّلت المنشئات بـ super. هذه الصفحة تغيّر بدنة المتد على الابن. افتح Yard.java. أبقِ اسم الفئة العامة Yard. احذف طباعات المنشئ فقط لـ car وtruck إن دفنت قصة المتد، وعروض المسار المتبقية، وكتّاب Store، وأي Scanner للوحة المفاتيح. لا ينتظر البرنامج الكتابة. لا تحتاج سطر import.
أعلن الأب بمتد عيّنة يطبع beep:
class Car {
void horn() {
System.out.println("beep");
}
}
أعلن الابن بـ extends Car. داخل Truck اكتب نفس اسم المتد مجددًا، لكن اطبع honk:
void horn() {
System.out.println("honk");
}
الاسم المطابق وقائمة الوسائط الفارغة المطابقة يعنيان أن نسخة الابن تستبدل نسخة الأب لكائنات Truck. أنت لا تضيف متدًا ثانيًا بلا صلة. أنت تعيد تعريف horn.
داخل Yard.main ابنِ شاحنة واحدة واستدعِ المتد:
Truck t = new Truck();
t.horn();
الاستدعاء يشغّل البدنة المكتوبة على Truck، فتطبع الشاشة honk.
class Car {
void horn() {
System.out.println("beep");
}
}
class Truck extends Car {
void horn() {
System.out.println("honk");
}
}
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 في هذا الشكل للمبتدئين.
الشاشة تُظهر honk. امشِ التشغيل مرة. يبدأ Java من Yard.main. new Truck() يبني شاحنة. t.horn() ينظر إلى النوع الحقيقي لـ t. لأن Truck كتب horn الخاص به، تعمل بدنة الابن وتطبع honk. بدنة beep الأب تبقى على Car ولا تُستخدم لهذا استدعاء الشاحنة.
إذا ما زلت ترى beep، تحقق هل يحتوي Truck فعلًا على متد horn. Truck فارغ من صفحة الوراثة ما زال يرث beep. إعادة التعريف تتطلب حضور متد الابن بنفس الاسم. إذا ما زلت ترى car ثم truck من عرض منشئ، انتقل إلى ملف تعليم إعادة التعريف وشغّل java Yard مجددًا.
قل القاعدة بصوت عالٍ وأنت تنظر إلى الشاشة: نفس اسم المتد على الابن، بدنة الابن تفوز لذلك الكائن. أبقِ extends Car ليبقى Truck نوعًا من Car. بلا extends، يكون horn على Truck قصة نوع منفصلة، لا إعادة تعريف لمتد الأب.
لا تخترع ملف interface في هذه الصفحة. الواجهات تنتظر الدرس التالي. اليوم تسلسل فئات واحد يحمل بدنتي horn، وبدنة الابن تجيب الاستدعاء على شاحنة.
beep الأب وhonk الابن جنبًا إلى جنب
برنامج ثانٍ يحتفظ بإعادة التعريف. main يبني Car وTruck، ثم يستدعي horn على كل منهما. الأب ما زال يطبع beep. الابن ما زال يطبع honk.
class Car {
void horn() {
System.out.println("beep");
}
}
class Truck extends Car {
void horn() {
System.out.println("honk");
}
}
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 ثم honk. السطر الأول يأتي من كائن Car. السطر الثاني يأتي من كائن Truck. إعادة التعريف على الابن لا تمحو متد الأب لكائنات الأب. كل كائن يستخدم البدنة التي تخص نوعه.
اقرأ متدي horn مرة أخرى. نفس الاسم. نفس قائمة الوسائط الفارغة. نص طباعة مختلف. تطابق التوقيع هو ما يجعل نسخة الابن إعادة تعريف وليس متدًا جديدًا بلا صلة. إذا أعدت تسمية متد الابن إلى شيء آخر، تعيد الوراثة beep على الشاحنات، ولن تعدّ تدرّس إعادة التعريف.
إذا بقيت عروض منشئ super() في المجلد، احتفظ بها كتاريخ. لهذا الدرس شغّل ملف تعليم إعادة التعريف حتى تُظهر الشاشة طباعات المتد، لا كلمات ترتيب المنشئ. إذا اشتكى javac من فئات عامة مكررة، ما زال لديك أكثر من فئة عامة في الملف — أبقِ Yard فقط عامة.
بدنة الأب مقابل بدنة الابن
📊 Who prints what for horn
| Role | horn body |
|---|---|
Parent Car |
prints beep |
Child Truck |
prints honk (overrides) |
الجدول هو الخريطة القصيرة لهذه الصفحة. الوراثة وحدها تضع beep على الدورين عندما يبقى الابن فارغًا. بعد إعادة التعريف يتغيّر سطر الابن إلى honk بينما يبقى سطر الأب beep. احتفظ بهذه الخريطة عندما يطبع العرض الثاني كلا السطرين. |
مقارنة مع extends فارغ ومع super
في صفحة الوراثة، Truck الفارغ أبقى horn الأب وطبع beep. في صفحة super، شغّلت المنشئات عبر super وطبعت car ثم truck. في هذه الصفحة يتغيّر المتد نفسه على الابن. ما زلت تحتاج extends. ما زال بإمكانك استخدام المنشئات لاحقًا. لا تحتاج واجهة بعد.
إذا بقي Truck فارغ مفتوحًا، أضف horn الابن الذي يطبع honk قبل أن تحكم على الشاشة. إذا بقي ملف منشئ مفتوحًا، انتقل إلى ملف إعادة التعريف ليكون t.horn() الاستدعاء قيد الاختبار. الرموز الجديدة هي المتد المعاد كتابته على الابن وكلمتا الشاشة المختلفتان beep وhonk.
قبل الواجهات
يمكنك إعادة كتابة horn على Truck ورؤية honk من t.horn(). يمكنك استدعاء c.horn() وt.horn() ورؤية beep ثم honk. ترجم Yard.java وشغّل java Yard لكل عرض محفوظ بالتتابع. أجابت بدنة الابن استدعاء الشاحنة. الصفحة التالية الواجهات، حيث يمكن لنوع أن يعد بمتدات دون الاعتماد على extends وحده.
احتفظ بعرض الشاحنة الواحدة مع honk لإعادة تعريف واضحة. احتفظ بعرض الكائنين لتباين واضح بين الأب والابن. أبقِ ملفات الواجهة خارج هذه الصفحة. تلك العادات الثلاث نقطة تفتيش قبل المتابعة. عندما يظهر honk بعد t.horn() وما زال beep يظهر بعد c.horn()، أنجزت إعادة التعريف عمل هذا الدرس وأنت جاهز للموضوع التالي عن الواجهات.
مراجعة أخيرة للمجلد: Yard عام واحد، نوعان مساعدان، horn ابن يطبع honk، بلا انتظار للوحة المفاتيح، بلا إجبار على واجهة. شغّل javac Yard.java وjava Yard مرة أخرى على العرض المفتوح. إذا ما زالت الشاشة تطابق الجدول — أب beep، ابن honk — فإعادة التعريف ثابتة ويمكن للدورة الانتقال إلى الواجهات في الصفحة التالية.
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى