super في Java
استخدم super داخل منشئ الابن ليعمل منشئ الأب أولًا. أبقِ Truck extends Car. داخل Truck() اكتب super(); ثم اطبع truck. داخل Car() اطبع car. ترجم Yard.java وشغّل java Yard. يجب أن تُظهر الشاشة car ثم truck. عرض ثانٍ يمرّر علامة بـ super("car") إلى Car(String mark). اترك إعادة تعريف متد للصفحة التالية — هذا الدرس عن ترتيب المنشئين مع super.
نادِ منشئ الأب أولًا
صفحة الوراثة سمحت لـ Truck فارغ باستخدام horn من Car. هذه الصفحة تضيف المنشئين. افتح Yard.java. أبقِ اسم الفئة العامة Yard. احذف عروض المسار المتبقية، وملفات horn فقط إن شوّشت على المنشئين، وكتّاب Store، وأي Scanner للوحة المفاتيح. لا ينتظر البرنامج الكتابة. لا تحتاج سطر import.
أعلن الأب بمنشئ بلا وسائط يطبع car:
class Car {
Car() {
System.out.println("car");
}
}
أعلن الابن بـ extends Car. داخل Truck() اجعل super(); أول جملة، ثم اطبع truck:
super();
System.out.println("truck");
داخل Yard.main ابنِ شاحنة واحدة:
Truck t = new Truck();
بناء الشاحنة يدخل Truck(). ذلك الاستدعاء يبدأ بـ super() فيشغّل Car(). بعد انتهاء الأب يعمل طبع الابن.
class Car {
Car() {
System.out.println("car");
}
}
class Truck extends Car {
Truck() {
super();
System.out.println("truck");
}
}
public class Yard {
public static void main(String[] args) {
Truck t = new Truck();
}
}
من المجلد الذي يحوي Yard.java شغّل javac Yard.java. عندما تتطابق الأقواس والفواصل المنقوطة، لا يكتب javac سطرًا خاصًا به. ثم شغّل java Yard — وليس java Yard.java. اترك لاحقة .java خارج أمر التشغيل. أبقِ فئة عامة واحدة في الملف ليطابق الاسم Yard. النوعان المساعدان Car وTruck يبقيان بلا public في هذا الشكل للمبتدئين.
الشاشة تُظهر car ثم truck. امشِ التشغيل مرة. يبدأ Java من Yard.main. new Truck() يدخل Truck(). الجملة الأولى super();، فيعمل Car() ويطبع car. يعود التحكم إلى Truck() فيطبع truck. يظهر سطر الأب قبل سطر الابن لأن super() جرى أولًا.
قل الترتيب بصوت عالٍ وأنت تنظر إلى الشاشة: منشئ الأب، ثم طبع الابن. ذلك الترتيب المنطوق يطابق ما يفرضه super() في منشئ الابن. إذا وصلت الأسطر بترتيب خاطئ، افتح ملف التعليم مجددًا وتحقق أن super(); ما زال أول جملة داخل Truck() قبل أي println.
إذا طبعت truck قبل super() في تجربة لاحقة يحتاج فيها منشئ الأب وسائط، قد يرفض javac — يجب أن يكون super أول جملة عندما تكتبه. في العرض الأول الأب بلا وسائط، وملف التعليم يبقي super(); أولًا عمدًا ليبقى الترتيب واضحًا. إذا رأيت فقط beep من عرض horn قديم، انتقل إلى ملف تعليم المنشئ وشغّل java Yard مجددًا.
لا تعِد كتابة horn على Truck في هذه الصفحة. إعادة تعريف متد هي الدرس التالي. اليوم منشئ الابن يتحدث مع الأب بـ super، ثم يطبع كلمته. أبقِ كلمة car عند الأب وtruck عند الابن حتى يبيّن كل سطر أي منشئ انتهى.
مرّر قيمة إلى الأب بـ super
برنامج ثانٍ يحتفظ بـ extends. منشئ الأب يأخذ الآن String mark ويطبع تلك العلامة. الابن يستدعي super("car") ثم يطبع truck.
class Car {
Car(String mark) {
System.out.println(mark);
}
}
class Truck extends Car {
Truck() {
super("car");
System.out.println("truck");
}
}
public class Yard {
public static void main(String[] args) {
Truck t = new Truck();
}
}
ترجم بـ javac Yard.java، ثم شغّل java Yard. الشاشة تُظهر مجددًا car ثم truck. هذه المرة car هو الوسيط الذي مرّرته عبر super("car")، وليس طبعًا ثابتًا داخل Car() بلا وسائط. الابن اختار سلسلة العلامة؛ منشئ الأب طبعها. بعد ذلك طبع الابن truck.
اقرأ توقيع منشئ الأب مرة أخرى: Car(String mark). السلسلة بين علامتي الاقتباس داخل super("car") هي تلك العلامة. لا تغيّر شيئًا آخر في الملف لهذا الفحص — أبقِ extends Car، وأبقِ طبع الابن لـ truck، وأبقِ new Truck() في main. الشاشة ما زالت تنتهي بـ truck تحت car لأن طبع الابن يجري فقط بعد عودة super("car").
إذا حذفت super("car") بينما Car يملك فقط Car(String mark)، يرفض javac، لأن الأب لم يعد يملك منشئًا صامتًا بلا وسائط يستدعيه عنك. كتابة استدعاء super(...) المطابق هي كيف يبدأ الابن الأب بالقيم التي يحتاجها. أبقِ super أول جملة في Truck(). إذا اشتكى javac من غياب منشئ افتراضي على Car، انظر أولًا إلى منشئ الابن وتأكد أن سطر super("car") موجود وما زال أولًا.
مقارنة مع extends البسيط في صفحة horn
في صفحة الوراثة استدعى Truck فارغ horn دون كتابة منشئين. في هذه الصفحة تعمل المنشئات بالترتيب عبر super. احتفظ بعروض horn كتاريخ إن بقيت قريبة؛ شغّل ملف تعليم super بـ java Yard حتى تُظهر الشاشة car ثم truck.
صفحة horn أثبتت أن extends يشارك متدًا. هذه الصفحة تثبت أن extends يشارك أيضًا مسار بناء: الابن يبدأ الأب عبر super، ثم يكمل بطبعه. كلا الدرسين يبقيان Truck extends Car. يتغيّر فقط جسم Truck — من أقواس فارغة مع استدعاء horn لاحقًا، إلى منشئ يبدأ بـ super.
الرموز الجديدة هي super() وsuper("car") وترتيب المنشئين. ما زلت تحتاج extends. لا تحتاج إعادة تعريف متد بعد. إذا بقي استدعاء horn في main، احذفه لهذه العروض حتى تُظهر الشاشة فقط طباعات المنشئ.
ما تتركه هذه الصفحة لإعادة التعريف
هذه الصفحة تشغّل منشئات الأب بـ super. الصفحة التالية تُظهر إعادة التعريف، حيث يكتب الابن نسخته من متد يملكه الأب مسبقًا. ابقَ هنا مع استدعاءات super في المنشئ. لا تستبدل horn على Truck كمتطلب في هذه العروض بعد.
عندما تعيد تعريف متد لاحقًا، ستستدعي غالبًا منشئ الأب بـ super أولًا. اعتبر هذه الصفحة نصف المنشئ من تلك القصة. أنهِ عرضي Yard حتى يصبح car ثم truck تلقائيًا قبل أن تفتح درس إعادة التعريف.
قبل إعادة التعريف
يمكنك استدعاء super(); ثم طبع truck ورؤية car أولًا. يمكنك استدعاء super("car") عندما يأخذ الأب علامة وما زلت ترى car ثم truck. ترجم Yard.java وشغّل java Yard لكل عرض محفوظ بالتتابع. انتهى منشئ الأب قبل طبع الابن. الصفحة التالية إعادة التعريف، حيث يستبدل الابن جسم متد.
احتفظ بعرض super() بلا وسائط لترتيب واضح. احتفظ بعرض super("car") لتمرير وسيط واضح. أبقِ إعادة تعريف المتد خارج هذه الصفحة. تلك العادات الثلاث نقطة تفتيش قبل المتابعة. عندما يظهر car فوق truck بعد new Truck()، فقد أنجز super عمل هذا الدرس وأنت جاهز للموضوع التالي عن إعادة التعريف.
مراجعة أخيرة للمجلد: Yard عام واحد، نوعان مساعدان، بلا انتظار للوحة المفاتيح، بلا بقايا مسار، بلا إجبار على إعادة كتابة horn. شغّل javac Yard.java وjava Yard مرة أخرى على العرض المفتوح. إذا ما زالت الشاشة تطبع car ثم truck، فترتيب المنشئ ثابت ويمكن للدورة الانتقال إلى إعادة التعريف في الصفحة التالية.
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى