في JavaRush، يتم تعريف الطلاب بالكلمة الرئيسية حرفيًا من المحاضرات الأولى
واتضح أنك ببساطة تقوم بتعيين قيمة لمتغير
أي
وفيما يلي رمز البرنامج مع الكلمة الأساسية
this
. ومع مرور الوقت يصبح واضحا ما يعنيه. لكن الكثيرين، إذا نظروا إلى الوراء، ربما يقولون لأنفسهم بصدق أنهم لم يتمكنوا من تحقيق زن هذه الكلمة الرئيسية لفترة طويلة. في هذه المقالة نكشف النقاب عن الأسرار المتعلقة باستخدام الكلمات الرئيسية this
لأولئك الذين ما زالوا غير قادرين على اكتشافها... مرحبًا! إذا اخترت كتاب Java المرجعي الخاص بـ Schildt ، فستقرأ في الصفحة 171 أن الكلمة الأساسية this
مطلوبة حتى تتمكن الطريقة من الرجوع إلى الكائن الذي يطلق عليها. يمكن أن يكون هذا في الواقع نهاية الأمر. لكننا بحاجة إلى تفاصيل. وكقاعدة عامة، this
ينبغي استخدامه في حالتين:
- عندما يكون لمتغير مثيل الفئة ومتغير الطريقة/المنشئ نفس الاسم؛
- عندما تحتاج إلى استدعاء مُنشئ من نوع واحد (على سبيل المثال، مُنشئ افتراضي أو ذو معلمات) من نوع آخر. وهذا ما يسمى أيضًا استدعاء منشئ صريح.
المثال الأول - متغير المثيل ومتغير الأسلوب لهما نفس الاسم
لنفترض أن لدينا فئةHuman
تم تحديد حقل "الاسم" لها: لنقم name
بإنشاء أداة ضبط للمتغير (أداة الضبط تعمل تمامًا ولا توجد خدعة هنا): يرجى ملاحظة أننا نقوم بتمرير المتغير إلى الطريقة (أداة الضبط ) . لقد قدمنا متغيرًا جديدًا ويمكننا (بشكل عام) تسميته كما أردنا لأنه سيكون مرئيًا فقط داخل الأقواس المتعرجة للطريقة . لاحظ أن هناك سطرًا واحدًا في أداة الضبط: setName
String newName
setName
name = newName;
أي أننا، في الواقع، قدمنا متغيرًا جديدًا newName
وقمنا بتخصيصه لمتغير موجود بالفعل في الفصل name
. اعتقد العديد من المبرمجين أنه من الغريب تقديم متغير باسم جديد إذا كنا نتحدث في النهاية عن نفس الشيء. حول الاسم في الفصل Human
. ولذلك، فكر مطورو اللغة في جعل استخدام اسم متغير واحد مناسبًا. وبعبارة أخرى، لماذا يكون هناك اسمان للمتغير الذي يعني نفس الشيء. أي أنني أود أن أفعل شيئًا كهذا: ولكن في هذه الحالة تنشأ مشكلة . لدينا الآن متغيران يحملان نفس الاسم. أحدهما String name
ينتمي إلى الفصل Human
والآخر String name
إلى طريقته setName
. لذلك، لا يعرف جهاز Java المتغير الذي تقصده عندما تكتب سلسلة في أداة ضبط:
name = name;
تأخذ Java الأقرب - name
من الطريقة setName
:
name
من هذه الطريقة إليه. وهذا بالطبع لا معنى له. ولذلك، كانت هناك حاجة إلى طريقة ما لتمييز متغير name
من فئة Human
من متغير name
من طريقة setName
. لحل هذه المشكلة، تم تقديم الكلمة الأساسية this
، والتي في هذه الحالة سوف تشير إلى أنه من الضروري استدعاء متغير ليس من الأسلوب، ولكن من فئة Human
:
this
أنه سيشير إلى الكائن المستدعي، كما قيل في بداية المقال. setName
ونتيجة لذلك، سيتم تعيين اسم الشخص من خلال أداة الضبط إلى الكائن الذي تم إنشاؤه. يوجد أدناه الرمز دون استخدام الكلمة الأساسية this
. يقوم الكود بإنشاء كائن فئة Human
ويعطيه اسمًا:
this
:
public class Solution{
public static void main(String[] args) {
Human human1 = new Human();
human1.setName("Volodya");
human1.print();
}
}
class Human{
String name;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
void print(){
System.out.println(name);
}
}
وبالتالي، فإنه this
يتجنب إدخال متغيرات جديدة للدلالة على نفس الشيء، مما يجعل الكود أقل "تحميلاً زائدًا" بمتغيرات إضافية.
المثال الثاني - استخدام هذا لاستدعاء المنشئ بشكل صريح
يمكن أن يكون استدعاء مُنشئ واحد من مُنشئ آخر مفيدًا عندما يكون لديك (بشكل غريب) العديد من المُنشئين ولا ترغب في إعادة كتابة رمز التهيئة المقدم مسبقًا في المُنشئ في مُنشئ جديد. مشوش؟ كل شيء ليس مخيفا كما يبدو. انظر إلى الكود أدناه، فهو يحتوي على مُنشئي فئةHuman
:
class Human{
int age;
int weight;
int height;
Human(int age, int weight){
this.age = age;
this.weight = weight;
}
Human(int age, int weight, int height){
//you call the constructor with two parameters
this(age, weight);
//and add the missing variable
this.height = height;
}
}
هنا لدينا أولاً مُنشئ ذو معلمتين يقبل int age
و int weight
. لنفترض أننا كتبنا سطرين من التعليمات البرمجية فيه:
this.age = age;
this.weight = weight;
ثم قرروا إضافة مُنشئ آخر، بثلاثة معلمات، بالإضافة إلى العمر والوزن، يأخذ الارتفاع أيضًا. في المنشئ الجديد يمكنك كتابة هذا:
this.age = age;
this.weight = weight;
this.height = height;
ولكن بدلاً من تكرار التعليمات البرمجية التي كتبتها بالفعل في هذا المنشئ، يمكنك استخدام كلمة أساسية لاستدعاء this
المنشئ بشكل صريح باستخدام معلمتين:
this(age, weight);
// and add the missing variable:
this.height = height;
لذا فأنت نوعًا ما تخبر المُنشئ بثلاثة معلمات:
- استدعاء هذا المنشئ، الذي يحتوي على معلمتين.
- وأضف المتغير المفقود.
this
إلى جميع الطرق باستثناء الطرق الثابتة (ولهذا السبب this
يطلق عليها غالبًا معلمة ضمنية) ويمكن استخدامها للإشارة إلى الكائن الذي يسمى الطريقة. ليست هناك حاجة للخوف من هذه الكلمة الرئيسية، لأنها This
ليست مخيفة.
GO TO FULL VERSION