this
وهما
super
كلمتان رئيسيتان خاصتان في Java تمثلان المثيل الحالي للفئة وفئتها الفائقة، على التوالي. غالبًا ما يخلط مبرمجو Java بين هذه الكلمات ويظهرون القليل من الوعي بخصائصها الخاصة، والتي غالبًا ما يتم السؤال عنها في مقابلات Java Core. على سبيل المثال، هناك سؤالان يتبادران إلى الذهن فورًا يتعلقان بـ
this
و
super
، هل من الممكن تعيين معنى مختلف لكلمة رئيسية
this
في Java؟ وما هو الفرق بين الكلمات الرئيسية
this
وفي
super
جافا. لا أعلم؟ حسنًا، أنا لا أعطي الإجابة هنا، بل يمكن العثور عليها في نهاية المقال.
لذلك، كما قلت في البداية، فإن الفرق الرئيسي بين جافا
this
وفيها
super
هو أن
this
المثيل الحالي للفئة يمثل، في حين
super
يمثل المثيل الحالي للفئة الأصل. فيما يلي أحد الأمثلة على استخدام المتغيرات -
this
وربما
super
تكون قد شاهدت بالفعل أمثلة على استدعاء منشئي واحد من الآخر، ما يسمى. استدعاء المنشئين في سلسلة، وهذا ممكن من خلال استخدام الكلمات الرئيسية
this
و
super
. يتم استخدام داخل الفصل لاستدعاء المُنشئ بدون وسيطة
this()
، بينما
super()
يتم استخدامه لاستدعاء المُنشئ بدون وسيطة، أو كما يطلق عليه أيضًا المُنشئ الافتراضي للفئة الأصلية. بالمناسبة، بهذه الطريقة لا يمكنك استدعاء مُنشئ بدون وسيطات فحسب، بل يمكنك أيضًا استدعاء أي مُنشئ آخر عن طريق تمرير المعلمات المناسبة له.
this
وسنرى مثالاً على هذا الاستخدام قريباً
super
. يتم استخدامها أيضًا في
this
Java
super
للوصول إلى متغيرات مثيل الفئة ووالدها. في الواقع، يمكن الوصول إليها بدون البادئات
super
و
this
، ولكن فقط إذا كانت هذه المتغيرات في الكتلة الحالية لا تتداخل مع المتغيرات الأخرى، أي. إذا لم يكن يحتوي على متغيرات محلية بنفس الأسماء، وإلا فسيتعين عليك استخدام أسماء ذات بادئات، لكن هذا لا يهم، لأن وفي هذا النموذج تكون أكثر قابلية للقراءة. أحد الأمثلة الكلاسيكية لهذا الأسلوب هو استخدامه
this
داخل مُنشئ يأخذ معلمة بنفس اسم متغير المثيل. سنكتشف لاحقًا في المقالة الاختلافات الأخرى الموجودة بين
super
و
this
، ونلقي نظرة على بعض الأمثلة على استخدامها.
كيف يتشابه هذا والسوبر
قبل النظر إلى الاختلافات بين الكلمات الرئيسية
this
و
super
، دعنا نلقي نظرة على بعض أوجه التشابه بينهما:
- كلاهما
this
و و super
متغيرات غير ثابتة، لذلك لا يمكن استخدامها في سياق ثابت، مما يعني أنه لا يمكن استخدامها في الطريقة الرئيسية. سيؤدي هذا إلى حدوث خطأ في وقت الترجمة "لا يمكن الرجوع إلى متغير غير ثابت this
من سياق ثابت". يحدث نفس الشيء إذا استخدمت الكلمة الأساسية في الطريقة الرئيسية super
.
- يمكن استخدام كلاهما
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("");
System.out.println("Конструктор без аргументов класса B");
}
B(String args){
super("");
System.out.println("Конструктор с одним аргументом класса B");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
}
}
الإخراج: مُنشئ وسيطة واحدة من الفئة A مُنشئ وسيطة واحدة من الفئة B مُنشئ بدون وسيطة من الفئة B
- داخل المنشئ
this
، ويجب super
أن يظهر فوق جميع التعبيرات الأخرى، في البداية، وإلا سيصدر المترجم رسالة خطأ. ويترتب على ذلك أن مُنشئًا واحدًا لا يمكن أن يحتوي على كليهما this()
و super()
.
الفرق بين السوبر وهذا
الآن نحن نعرف كيفية استخدام الكلمات الرئيسية
super
ونفهم
this
سبب الحاجة إليها. ولكن هناك خيارًا آخر لاستخدام هذه الكلمات الرئيسية التي لم أذكرها - في الفئات الداخلية، حيث يكون من السهل جدًا بمساعدتها الإشارة إلى فئة خارجية باستخدام نموذج التدوين الخارجي.
this
لمثيله الحالي والخارجي.
super
- لوالديه. لا تنس استبدال Outer باسم الطبقة الخارجية. الآن دعونا ندرج بإيجاز الاختلافات الرئيسية بين الكلمات الرئيسية
this
و
super
- يشير المتغير
this
إلى المثيل الحالي للفئة التي يتم استخدامه فيها، بينما يشير super
إلى المثيل الحالي للفئة الأصلية.
- كل مُنشئ، في حالة عدم وجود استدعاءات صريحة للمنشئين الآخرين، يستدعي ضمنيًا
super()
المُنشئ بدون وسيطة لفئته الأصلية، ولكن لديك دائمًا خيار استدعاء أي مُنشئ آخر بشكل صريح باستخدام إما أو this()
أو super()
.
ربما هذا هو كل ما يمكن قوله عن الاختلافات بين الكلمات الرئيسية
this
وفي
super
Java وكيفية استخدامها في البرامج. كما رأينا، فإن الغرض الرئيسي منها هو استدعاء منشئ من آخر والإشارة إلى متغيرات الحالة المعلنة في الفئة الحالية والفئة الأصلية الخاصة بها. لا تنس أن هذه ليست متغيرات عادية تمامًا، والآن - الإجابة على سؤالي الذي طرحته في الفقرة الأولى.
this
لا، لا يمكن تعيين قيمة جديدة للمتغير لأنه تم إعلانه نهائيًا. يمكنك محاولة القيام بذلك في IDE - ستتلقى خطأ في الترجمة "لا يمكنك تعيين قيمة جديدة لمتغير
this
- تم الإعلان عنها نهائية."
المقال الأصلي هنا .
GO TO FULL VERSION