JavaRush /مدونة جافا /Random-AR /الفرق بين هذه والكلمات الرئيسية الفائقة في Java
grishin
مستوى
Харьков

الفرق بين هذه والكلمات الرئيسية الفائقة في Java

نشرت في المجموعة
thisوهما superكلمتان رئيسيتان خاصتان في Java تمثلان المثيل الحالي للفئة وفئتها الفائقة، على التوالي. غالبًا ما يخلط مبرمجو Java بين هذه الكلمات ويظهرون القليل من الوعي بخصائصها الخاصة، والتي غالبًا ما يتم السؤال عنها في مقابلات Java Core. على سبيل المثال، هناك سؤالان يتبادران إلى الذهن فورًا يتعلقان بـ thisو super، هل من الممكن تعيين معنى مختلف لكلمة رئيسية thisفي Java؟ وما هو الفرق بين الكلمات الرئيسية thisوفي superجافا. لا أعلم؟ حسنًا، أنا لا أعطي الإجابة هنا، بل يمكن العثور عليها في نهاية المقال. الفرق بين هذه والكلمات الرئيسية الفائقة في Java - 1لذلك، كما قلت في البداية، فإن الفرق الرئيسي بين جافا thisوفيها superهو أن thisالمثيل الحالي للفئة يمثل، في حين superيمثل المثيل الحالي للفئة الأصل. فيما يلي أحد الأمثلة على استخدام المتغيرات - thisوربما superتكون قد شاهدت بالفعل أمثلة على استدعاء منشئي واحد من الآخر، ما يسمى. استدعاء المنشئين في سلسلة، وهذا ممكن من خلال استخدام الكلمات الرئيسية thisو super. يتم استخدام داخل الفصل لاستدعاء المُنشئ بدون وسيطة this()، بينما super()يتم استخدامه لاستدعاء المُنشئ بدون وسيطة، أو كما يطلق عليه أيضًا المُنشئ الافتراضي للفئة الأصلية. بالمناسبة، بهذه الطريقة لا يمكنك استدعاء مُنشئ بدون وسيطات فحسب، بل يمكنك أيضًا استدعاء أي مُنشئ آخر عن طريق تمرير المعلمات المناسبة له. thisوسنرى مثالاً على هذا الاستخدام قريباً super. يتم استخدامها أيضًا في thisJava superللوصول إلى متغيرات مثيل الفئة ووالدها. في الواقع، يمكن الوصول إليها بدون البادئات superو this، ولكن فقط إذا كانت هذه المتغيرات في الكتلة الحالية لا تتداخل مع المتغيرات الأخرى، أي. إذا لم يكن يحتوي على متغيرات محلية بنفس الأسماء، وإلا فسيتعين عليك استخدام أسماء ذات بادئات، لكن هذا لا يهم، لأن وفي هذا النموذج تكون أكثر قابلية للقراءة. أحد الأمثلة الكلاسيكية لهذا الأسلوب هو استخدامه thisداخل مُنشئ يأخذ معلمة بنفس اسم متغير المثيل. سنكتشف لاحقًا في المقالة الاختلافات الأخرى الموجودة بين superو this، ونلقي نظرة على بعض الأمثلة على استخدامها.

كيف يتشابه هذا والسوبر

قبل النظر إلى الاختلافات بين الكلمات الرئيسية thisو super، دعنا نلقي نظرة على بعض أوجه التشابه بينهما:
  1. كلاهما thisو و superمتغيرات غير ثابتة، لذلك لا يمكن استخدامها في سياق ثابت، مما يعني أنه لا يمكن استخدامها في الطريقة الرئيسية. سيؤدي هذا إلى حدوث خطأ في وقت الترجمة "لا يمكن الرجوع إلى متغير غير ثابت thisمن سياق ثابت". يحدث نفس الشيء إذا استخدمت الكلمة الأساسية في الطريقة الرئيسية super.

  2. يمكن استخدام كلاهما thisو superداخل المُنشئات لاستدعاء المُنشئين الآخرين في سلسلة، على سبيل المثال، this() و super() استدعاء المُنشئ بدون وسيطات الفئتين الموروثة والأصلية، على التوالي.
في المثال أدناه، نقوم أولاً بتمرير استدعاء من مُنشئ بدون وسيطة من الفئة B إلى مُنشئ من نفس الفئة B الذي يأخذ معلمة واحدة من النوع String، والتي بدورها super("")تستدعي المُنشئ ذو الوسيطة الواحدة من الفئة الفائقة.
class A{

    A(){
        System.out.println("Конструктор без аргументов класса A");
    }

    A(String args){
        System.out.println("Конструктор с одним аргументом класса A");
    }
}

class B extends A{

   B(){
        this(""); // вызов конструктора с одним аргументом класса B
        System.out.println("Конструктор без аргументов класса B");
    }

   B(String args){
        super(""); // вызов конструктора с одним аргументом класса A
        System.out.println("Конструктор с одним аргументом класса B");
    }
}

// Тест-класс и вывод
public class Test {

    public static void main(String args[]) {
       B b = new B();
    }

}
الإخراج: مُنشئ وسيطة واحدة من الفئة A مُنشئ وسيطة واحدة من الفئة B مُنشئ بدون وسيطة من الفئة B
  1. داخل المنشئ this، ويجب superأن يظهر فوق جميع التعبيرات الأخرى، في البداية، وإلا سيصدر المترجم رسالة خطأ. ويترتب على ذلك أن مُنشئًا واحدًا لا يمكن أن يحتوي على كليهما this()و super().

الفرق بين السوبر وهذا

الآن نحن نعرف كيفية استخدام الكلمات الرئيسية superونفهم thisسبب الحاجة إليها. ولكن هناك خيارًا آخر لاستخدام هذه الكلمات الرئيسية التي لم أذكرها - في الفئات الداخلية، حيث يكون من السهل جدًا بمساعدتها الإشارة إلى فئة خارجية باستخدام نموذج التدوين الخارجي. thisلمثيله الحالي والخارجي. super- لوالديه. لا تنس استبدال Outer باسم الطبقة الخارجية. الآن دعونا ندرج بإيجاز الاختلافات الرئيسية بين الكلمات الرئيسية thisوsuper
  1. يشير المتغير thisإلى المثيل الحالي للفئة التي يتم استخدامه فيها، بينما يشير superإلى المثيل الحالي للفئة الأصلية.

  2. كل مُنشئ، في حالة عدم وجود استدعاءات صريحة للمنشئين الآخرين، يستدعي ضمنيًا super()المُنشئ بدون وسيطة لفئته الأصلية، ولكن لديك دائمًا خيار استدعاء أي مُنشئ آخر بشكل صريح باستخدام إما أو this()أو super().
ربما هذا هو كل ما يمكن قوله عن الاختلافات بين الكلمات الرئيسية thisوفي superJava وكيفية استخدامها في البرامج. كما رأينا، فإن الغرض الرئيسي منها هو استدعاء منشئ من آخر والإشارة إلى متغيرات الحالة المعلنة في الفئة الحالية والفئة الأصلية الخاصة بها. لا تنس أن هذه ليست متغيرات عادية تمامًا، والآن - الإجابة على سؤالي الذي طرحته في الفقرة الأولى. thisلا، لا يمكن تعيين قيمة جديدة للمتغير لأنه تم إعلانه نهائيًا. يمكنك محاولة القيام بذلك في IDE - ستتلقى خطأ في الترجمة "لا يمكنك تعيين قيمة جديدة لمتغير this- تم الإعلان عنها نهائية." المقال الأصلي هنا .
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION