🔍 فهم كلمة super في جافا: مفتاح التواصل مع الفئة الأم

كلمة super في جافا هي كلمة أساسية تُستخدم للوصول إلى أعضاء (متغيرات، دوال، منشئات) الفئة الأم (Parent Class) من داخل الفئة الفرعية (Subclass). تعتبر أداة حيوية في البرمجة كائنية التوجه لتحقيق التواصل الصحيح في علاقات الوراثة.


📌 لماذا نحتاج إلى super؟

عندما ترث فئة ما فئة أخرى، قد تحتاج إلى:

  1. استدعاء منشئ الفئة الأم من داخل منشئ الفئة الابنة
  2. الوصول إلى متغيرات أو دوال الفئة الأم التي تم إخفاؤها (overridden) في الفئة الابنة

بدون super، يصعب التفريق بين أعضاء الفئة الأم والابنة عندما يحملان نفس الاسم.


🏗️ استخدام super لاستدعاء منشئ الفئة الأم

يُستخدم super() لاستدعاء منشئ الفئة الأم من منشئ الفئة الابنة. يجب أن يكون هذا الاستدعاء هو أول أمر في المنشئ.

class Animal {
    String name;
    
    Animal(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    String breed;
    
    Dog(String name, String breed) {
        super(name); // استدعاء منشئ الفئة الأم
        this.breed = breed;
    }
}

في هذا المثال، يستدعي منشئ Dog منشئ Animal باستخدام super(name) لتهيئة خاصية name الموروثة.


🔄 استخدام super للوصول إلى دوال الفئة الأم

عندما تقوم الفئة الابنة بإعادة تعريف دالة موجودة في الفئة الأم (Override)، يمكن استخدام super لاستدعاء نسخة الدالة الأصلية.

class Animal {
    void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        super.makeSound(); // استدعاء دالة الفئة الأم
        System.out.println("Meow!");
    }
}

هنا نستدعي أولاً الدالة الأصلية من الفئة الأم ثم نضيف السلوك الجديد للفئة الابنة.


⚠️ ملاحظات مهمة حول super

  1. يجب أن يكون استدعاء super() أول أمر في منشئ الفئة الابنة
  2. يمكن استخدام super للوصول إلى المتغيرات المخفية في الفئة الأم
  3. لا يمكن استخدام super في الأساليب الساكنة (static methods)
  4. إذا لم تستدع super() explicitly، ستستدعي جافا تلقائياً المنشئ الافتراضي للفئة الأم

💡 مثال شامل يوضح استخدامات super

class Vehicle {
    int maxSpeed = 120;
    
    void display() {
        System.out.println("Maximum Speed: " + maxSpeed);
    }
}

class Car extends Vehicle {
    int maxSpeed = 180;
    
    void display() {
        super.display(); // استدعاء دالة الفئة الأم
        System.out.println("Car Maximum Speed: " + super.maxSpeed); // متغير الفئة الأم
        System.out.println("Car Maximum Speed: " + maxSpeed); // متغير الفئة الابنة
    }
}

public class Main {
    public static void main(String[] args) {
        Car myCar = new Car();
        myCar.display();
    }
}

مخرجات هذا البرنامج:

Maximum Speed: 120
Car Maximum Speed: 120
Car Maximum Speed: 180

🎯 الخلاصة

كلمة super تمكننا من:

  • استدعاء منشئات الفئة الأم بشكل صريح
  • الوصول إلى المتغيرات والدوال المخفية في الفئة الأم
  • بناء تسلسل هرمي صحيح بين الفئات في علاقات الوراثة