English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليميات Java الأساسية

Java تحكم العملية

Java متجه

Java توجيهي المشاريع (I)

Java توجيهي المشاريع (II)

Java توجيهي المشاريع (III)

معالجة الاستثناء Java

Java قائمة (List)

Java Queue (الصف)

Java Map مجموعة

Java Set مجموعة

Java إدخال/إخراج (I/O)

Java Reader/Writer

مواضيع أخرى في Java

كلمة super Java

في هذا الدرس، سنتعلم عن كلمة المفتاح super في Java من خلال المثال.

كلمة المفتاح super في Java تستخدم في الفئة الفرعية للوصول إلى أعضاء الفئة الرئيسية (خصائص، بناء، طرق).

قبل أن نتعلم عن كلمة المفتاح super، تأكد من أنك قد فهمتJava Inheritance.

استخدام كلمة المفتاح super

  1.  استدعاء طريقة معادلة من الطريقة الفرعية.

  2. إذا كانت الفئة الرئيسية (superclass) والفئة الفرعية (subclass) تحتويان على نفس الخاصية، فإن الوصول إلى الخاصية (الحقل) للفئة الرئيسية.

  3. استدعاء بناء الفئة الرئيسية بدون معلمات أو معلمات م参数ية من بناء الفئة الرئيسية.

  دعونا نتعرف على جميع هذه الاستخدامات.

1. الوصول إلى طريقة معادلة الفئة الرئيسية

إذا تم تعريف نفس اسم الطريقة في الفئة الرئيسية والفئة الفرعية، فإن الطريقة في الفئة الفرعية تغطي الطريقة في الفئة الرئيسية. هذا يسمىمعادلة الطريقة.

مثال 1: معادلة الطريقة

class Animal {
  // طريقة
  public void display(){
    System.out.println("I am an animal");
  }
}
class Dog extends Animal {
  // طريقة معادلة
  @Override
  public void display(){
    System.out.println("أنا كلب");
  }
  public void printMessage(){
    display();
  }
}
class Main {
  public static void main(String[] args) {
    Dog dog1 = new Dog();
    dog1.printMessage();
  }
}

نتيجة الطلاب

أنا كلب

في هذا المثال، من خلال إنشاء عنصر Dog dog1، يمكننا استدعاء طريقة printMessage الخاصة به، ثم تنفيذ جملة display.

بما أن display معادلة في كلا الفئتين، فإن طريقة Dog في الفئة الفرعية تغطي طريقة Animal في الفئة الرئيسية. لذلك، تم استدعاء طريقة Dog.

ماذا إذا كان عليك استدعاء طريقة معادلة الفئة الرئيسية؟

إذا كنت بحاجة إلى استدعاء طريقة display المعبأة في الفئة الرئيسية Animal، استخدم super.display().

مثال 2: استدعاء طريقة الفئة الرئيسية

class Animal {
  // طريقة
  public void display(){
    System.out.println("I am an animal");
  }
}
class Dog extends Animal {
  // طريقة معادلة
  @Override
  public void display(){
    System.out.println("أنا كلب");
  }
  public void printMessage(){
    // هذا يدعو إلى طريقة معادلة
    display();
    // هذا يدعو إلى طريقة الفئة الرئيسية
    super.display();
  }
}
class Main {
  public static void main(String[] args) {
    Dog dog1 = new Dog();
    dog1.printMessage();
  }
}

نتيجة الطلاب

أنا كلب
I am an animal

في هذا المكان، كيف يعمل البرنامج المذكور أعلاه.

2. الوصول إلى خصائص الفئة الرئيسية (الأب)

يمكن للفئة الرئيسية والفئة الفرعية أن تملك نفس اسم الخاصية. نستخدم كلمة المفتاح super للوصول إلى خصائص الفئة الرئيسية.

مثال 3: الوصول إلى خصائص الفئة الرئيسية

class Animal {
  protected String type="حيوان";
}
class Dog extends Animal {
  public String type="مستأنس";
  public void printType() {
    System.out.println("أنا " + type);
    System.out.println("أنا كلب " + super.type);
  }
}
class Main {
  public static void main(String[] args) {
    Dog dog1 = new Dog();
    dog1.printType();
  }
}

الإخراج:

أنا حيوان مفترس
أنا حيوان

في هذا المثال، قمنا بتعريف نفس نوع الحقل الخاص في الفئة الرئيسية Animal وفئة الفرعية Dog.
ثم قمنا بإنشاء كائن من فئة Dog (dog1). ثم تم استدعاء دالة printType() باستخدام هذا الكائن.

في داخل دالة printType()،

  • type - يشير إلى الخاصية Dog للفئة الفرعية.

  • super.type - يشير إلى الخاصية Animal للفئة الأصلية.

لذلك، الإخراج "أنا " + type);الإخراج "أنا حيوان مفترس"، وقد تم الإخراج "أنا حيوان " + super.type);الإخراج "أنا حيوان".

3. استخدام super() لزيارة بناء الحالة للفئة الأصلية

من المعروف أن يتم استدعاء بناء الحالة الافتراضي تلقائيًا عند إنشاء كائن من الفئة.

للإشارة بشكل صريح إلى بناء الحالة للفئة الأصلية من بناء الحالة للفئة الفرعية، نستخدم super(). هذا هو شكل خاص للكلمة المفتاحية super.

ملاحظة: يمكن استخدام super() فقط في بناء الحالة للفئة الفرعية ويجب أن يكون أول جملة.

مثال 4: استخدام super()

class Animal {
  //بناء الحالة الافتراضي أو بدون معلمات للفئة Animal
  Animal() {
    System.out.println("I am an animal");
  }
}
class Dog extends Animal {
  //بناء الحالة الافتراضي أو بدون معلمات للفئة Dog
  Dog() {
    //استدعاء بناء الحالة الافتراضي للفئة الأصلية
    super();
    System.out.println("أنا كلب");
  }
}
class Main {
  public static void main(String[] args) {
    Dog dog1 = new Dog();
  }
}

نتيجة الطلاب

I am an animal
أنا كلب

في هذا المثال، عند إنشاء كائن من فئة Dog (dog1)، يتم استدعاء بناء الحالة الافتراضي أو بدون معلمات لهذه الفئة تلقائيًا.
في بناء الحالة للفئة الفرعية، يدعو جملة super() بناء الحالة للفئة الأصلية ويُ�行 الجمل الموجودة فيها. لذا، نحصل على النتيجة"I am an animal".

ثم يعود مسار البرنامج إلى بناء الحالة للفئة الفرعية ويُ�行 باقي الجمل.

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

إذا كان المبرمج يُدعى super() تلقائيًا من قبل المبرمج، لماذا نحتاج إلى استخدامه بشكل صريح ونكتب كود زائد؟

إذا كان من الضروري دعوة بناء الحالة للفئة الأصلية من بناء الحالة للفئة الفرعية،بناء الحالة الم参数ية (بناء الحالة الم参数ية المزود بالمعلمات)، لذا يجب استخدامها بشكل صريح.

مع super() الم参数ييجب أن يكون دائمًاجسم بناء الفئة الفرعيةمنالجملة الأولى، وإلا فإنه سيحدث خطأ في التجميع.

مثال 5: استخدام super() لندعوة بناء الحالة الم参数ية

class Animal {
  //默认或无参数的构造函数
  Animal() {
    System.out.println("I am an animal");
  }
  //参数化构造函数
  Animal(String type) {
    System.out.println("النوع: " + type);
  }
}
class Dog extends Animal {
  // بناء المكونات المرتبطة بالبنية الافتراضي
  Dog() {
    // دعوة بناء المكونات المرتبطة بالبنية للفئة الأصلية
    super("Animal");
    System.out.println("أنا كلب");
  }
}
class Main {
  public static void main(String[] args) {
    Dog dog1 = new Dog();
  }
}

نتيجة الطلاب

النوع: Animal
أنا كلب

يمكن للملاحظة التلقائي دعوة بناء المكونات المرتبطة بالبنية الافتراضي. ولكن لا يمكنه دعوة بناء المكونات المرتبطة بالبنية المرتبطة بالبنية المزودة بالمعلمات.

إذا كان من الضروري دعوة بناء المكونات المرتبطة بالبنية المرتبطة بالبنية، فإنه يجب تعريفها بشكل صريح في بناء المكونات المرتبطة بالبنية للفئة الفرعية، مثل الجملة في الكود أعلاه:

super("Animal");

يرجى ملاحظة أننا استخدمنا super("Animal")، نحن ندعو بشكل صريح إلى بناء المكونات المرتبطة بالبنية. في هذه الحالة، لن يدعو الملاحظة إلى بناء المكونات المرتبطة بالبنية الافتراضي.