الكلمة المفتاحية super
جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 21 من 87.
توفر الكلمة المفتاحية super طريقة للفئة الفرعية (subclass) للإشارة إلى فئتها الأصلية (parent class). وهي ضرورية عندما تحتاج إلى الوصول إلى أعضاء الفئة الأصلية أو المشيدات (constructors) من داخل فئة تابعة (child class).
الاستخدام الأكثر شيوعاً لـ super هو استدعاء منشئ الفئة الأب (constructor). يجب أن يكون هذا هو البيان الأول في منشئ الفئة الفرعية:
public class Vehicle {
private String brand;
public Vehicle(String brand) {
this.brand = brand;
}
public String getBrand() {
return brand;
}
}
public class Car extends Vehicle {
private int doors;
public Car(String brand, int doors) {
super(brand); // يجب أن يكون السطر الأول
this.doors = doors;
}
}يمكنك أيضاً استخدام super لاستدعاء دوال الفئة الأب، وهو أمر مفيد بشكل خاص عندما تحتوي الفئة الفرعية على دالة بنفس الاسم:
public class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
public class Cat extends Animal {
public void makeSound() {
super.makeSound(); // يستدعي نسخة Animal
System.out.println("Meow!");
}
}فكر في super على أنها عكس this. بينما تشير this إلى الكائن الحالي، تشير super إلى جزء الفئة الأب (parent class) من ذلك الكائن. يصبح هذا التمييز حاسمًا عند بناء التسلسلات الهرمية للفئات حيث تحتاج الفئات التابعة (child classes) إلى توسيع سلوك الفئة الأب بدلاً من استبداله بالكامل.
التحدي
سهللنقم ببناء نظام أجهزة منزلية يوضح كيف يمكن للفئات التابعة (child classes) استخدام super لاستدعاء منشئات الفئة الأم (parent constructors) وتوسيع سلوك دوال الفئة الأم.
ستقوم بإنشاء ثلاثة ملفات لتنظيم الكود الخاص بك:
Appliance.java: أنشئ الفئة الأم التي تمثل أي جهاز منزلي. يجب أن تحتوي على:- حقل خاص (private field) لعلامة الجهاز التجارية
brand(String) - حقل خاص لـ
wattage(int) - منشئ (constructor) يقبل كلتا القيمتين ويقوم بتهيئتهما
- دالة
getBrand()تعيد العلامة التجارية - دالة
getWattage()تعيد القدرة الكهربائية (wattage) - دالة
getInfo()تعيد:[brand] - [wattage]W
- حقل خاص (private field) لعلامة الجهاز التجارية
WashingMachine.java: أنشئ فئة فرعية (subclass) ترث من Appliance. تمتلك الغسالة كل ما يمتلكه الجهاز المنزلي، بالإضافة إلى ميزاتها الخاصة:- حقل خاص لـ
capacity(int) يمثل سعة التحميل بالكيلوجرام - منشئ يأخذ brand و wattage و capacity - استخدم
super(brand, wattage)لتهيئة جزء الفئة الأم، ثم قم بتعيين السعة - دالة
getCapacity()تعيد السعة - دالة
getInfo()تستدعيgetInfo()الخاصة بالفئة الأم باستخدامsuper.getInfo()وتوسعها لتعيد:[parent info], Capacity: [capacity]kg
- حقل خاص لـ
Main.java: أنشئ كائن WashingMachine واعرض معلوماته الكاملة. ستتلقى ثلاثة مدخلات: العلامة التجارية (String)، والقدرة الكهربائية (int)، والسعة (int). اطبع نتيجة استدعاءgetInfo()على الغسالة الخاصة بك.
ستتلقى ثلاثة مدخلات: اسم العلامة التجارية، والقدرة الكهربائية، والسعة.
لاحظ كيف تخدم super غرضين هنا: استدعاء منشئ الفئة الأم لتهيئة الحقول الموروثة، واستدعاء دالة الفئة الأم للبناء على سلوكها بدلاً من استبداله بالكامل.
ورقة مرجعية
تشير الكلمة المفتاحية super إلى الفئة الأب (parent class) من داخل فئة فرعية (subclass).
استخدم super() لاستدعاء منشئ الفئة الأب (parent constructor). يجب أن يكون هذا هو البيان الأول في منشئ الفئة الفرعية:
public class Vehicle {
private String brand;
public Vehicle(String brand) {
this.brand = brand;
}
}
public class Car extends Vehicle {
private int doors;
public Car(String brand, int doors) {
super(brand); // يجب أن يكون السطر الأول
this.doors = doors;
}
}استخدم super.methodName() لاستدعاء دوال الفئة الأب، وهو أمر مفيد عندما تقوم الفئة الفرعية بتجاوز (override) دالة ما:
public class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
public class Cat extends Animal {
public void makeSound() {
super.makeSound(); // يستدعي نسخة Animal
System.out.println("Meow!");
}
}تشير super إلى جزء الفئة الأب من الكائن، بينما تشير this إلى الكائن الحالي.
جرّب بنفسك
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// قراءة المدخلات
String brand = scanner.nextLine();
int wattage = scanner.nextInt();
int capacity = scanner.nextInt();
// TODO: إنشاء كائن WashingMachine باستخدام قيم المدخلات
// TODO: طباعة نتيجة استدعاء getInfo() على washing machine
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات الـ OOP
الملفات الخارجيةمقدمة في الـ OOPالفئات (Classes) مقابل الكائنات (Objects)الكلمة المفتاحية thisالدوال (Methods)الحقول (Attributes)دالة البناء (Constructor)تعدد أشكال دالة البناء (Constructor Overloading)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسية (extends)الكلمة المفتاحية superإعادة تعريف الدوال (@Override)تسلسل المنشئات (Constructor Chaining)كلاس Objectالوراثة الأحادية ومتعددة المستوياتلماذا لا توجد وراثة متعددة للكلاساتمراجعة - هيكلية الموظفين7الدوال الخاصة وفئة Object
دالة toString()equals() و hashCode()دالة clone()compareTo() و Comparableواجهة Comparatorمراجعة - الترتيب المخصص2محددات الوصول والتغليف
نظرة عامة على مستويات الوصولدوال Getter و Setterإخفاء البياناتالكلمة المفتاحية finalمراجعة - مدير الحساب البنكي5تعدد الأشكال (Polymorphism)
أساسيات الـ Method Overloadingالـ Method Overriding (في وقت التشغيل)الـ Upcasting والـ Downcastingمعامل الـ instanceofالفئات والدوال المجردة (Abstract)مراجعة - حاسبة الأشكال8مفاهيم OOP المتقدمة
الـ Composition مقابل الـ Inheritanceالـ Aggregation مقابل الـ Compositionالفئات الداخلية والمتداخلة والمجهولة (Inner, Nested & Anonymous)الـ Enums ودوالهاالـ Records (Java 16+)الـ Sealed Classes (Java 17+)11أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factoryنمط Builderنمط Observerنمط Strategy3خصائص الفئة والعضو الساكن
المتغيرات الخاصة بالكائن مقابل المتغيرات الساكنةالدوال الساكنةالكتل البرمجية الساكنةالثوابت (static final)ملخص - العداد والأدوات المساعدة6الواجهات (Interfaces) والأصناف المجردة (Abstract Classes)
مقدمة في الواجهات (Interfaces)تنفيذ الواجهات (Interfaces)تنفيذ واجهات متعددةالـ Default و Static في الواجهاتالأصناف المجردة مقابل الواجهاتالواجهات الوظيفية (Functional Interfaces)مراجعة - نظام الدفع9الأنواع العامة (Generics)
مقدمة في الأنواع العامةالأصناف العامة (Generic Classes)الدوال العامة (Generic Methods)معاملات الأنواع المقيدةالرموز البديلة (?, extends, super)مراجعة - الحاويات العامة12أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكرر