كلمة this
مُقدَّميمكن للمعامل إخفاء الحقل الذي يجب تحديثه
- كائن له اسم "Ada". عند تشغيل setName(String name) مع القيمة "Bo"، يتم تنفيذ name = name.
- كلا الاسمين غير المؤهلين يشيران إلى المعامل، لذا لا يزال الكائن يحمل "Ada". this.name = name يُعيّن قيمة المعامل إلى الحقل بدلاً من ذلك.
"هذا العنصر"
- داخل دالة كائن،
thisتشير إلى الكائن الذي تم استدعاء الدالة عليه.student.addScore(10)يعمل معthis= ذلكstudent. this.scoreتعني "scoreالكائن الذي أعمل عليه." هذا يسمح للطريقة بالتحدث عن كائنها الخاص بوضوح.
التمييز بين الحقل والمعامل
- الاستخدام الرئيسي: تمييز متغير instance عن معامل بنفس الاسم.
void setName(String name) { this.name = name; } this.nameهو متغير الكائن؛ بينماnameالعادي هو المعامل. هذا هو الحل القياسي لمشكلة تظليل المتغيرات من 3.8.
الوصول إلى كائن المستقبل
thisيمنح الدالة إشارة (handle) على الكائن المحدد الذي تم استدعاؤها عليه. كل دالة عضو تحتوي ضمنيًا علىthis، سواء كتبتها أو لم تكتبها.- عندما يشير اسم score إلى حقل عضو غير مظلّل، يستخدم
score += s;this.score. إذا كان هناك وسيط أو متغير محلي يحمل اسم score ويظلل الحقل، فإن الاسم غير المؤهل يُشير بدلاً من ذلك إلى ذلك المتغير. تكتبthisصراحةً فقط عند الحاجة (مثل حل مشكلة التظليل).
يشير this إلى كائن المستقبل
داخل setName، this هو كائن ada الذي تم استدعاؤه عليه.
داخل دالة Instance، يشير this إلى...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
this هو مقبض على الكائن الحالي.
في setName(String name) { this.name = name; }، this.name هو...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
this.name هو الحقل؛ اسم name العادي هو المعامل.
يمكن استخدام كلمة this داخل دالة static.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
الدوال Static ليس لها كائن محدد، لذا لا يوجد this.
ماذا تفعل كتابة name = name؛ (بدون this) داخل setName(String name)؟
Difficulty 1/5 · 100 coins + a small bonus on first completion today
كلا الاسمين هما المعامل؛ استخدم this.name للوصول إلى الحقل.
كل دالة Instance تحتوي على this ضمني، سواء كتبتها أم لم تكتبها.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
تمتلك دالة实例 (Instance method) مستقبل حالي. إذا لم يكن هناك وسيط أو إعلان محلي يحجب هذا الحقل، فإن score غير المؤهل يشير فقط إلى this.score.
لا يوجد this في الدالة الثابتة
- الدالة الساكنة ليس لديها
this— فهي لا ترتبط بأي كائن محدد. لذلك لا يمكن للدالة الساكنة استخدامthisأو حقل عضو غير مؤهل، لكنها قد تقرأ حقلًا عبر إشارة صريحة إذا سمحت صلاحية الوصول بذلك. - محاولة استخدام
thisفي دالة ساكنة تُعد خطأ في وقت kompilation. إذا كنت بحاجة إلىthis، يجب أن تكون الدالة دالة عضو، وليست ساكنة.
استخدم this.field = param; للتغلب على الإخفاء — this.name هو متغير العنصر، وname البسيط هو المعامل. كتابة name = name; (بدون this) تعامِل المعامل لنفسه فقط. و**this لا يوجد في الدالة الثابتة** — الدالة الثابتة ليس لها عنصر معين، لذا لن يتم ترجمة استخدام this هناك.
Type the field value after the faulty setName("Bo") call on the described object.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
The parameter assigns to itself; the field is unchanged until this.name is used on the left.
إذا كان alias و a يشيران إلى نفس Student، فإن alias.setName("Di") يغير الاسم الذي سيتم قراءته لاحقًا عبر a.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
كلا المرجعين يحددان نفس كائن المستقبل، والذي يتم تحديث حقله.
يُنفذ كود في الكائن b استدعاء a.setName("Cy"). داخل.setName، ما هو الكائن الذي يمثل this؟
Difficulty 1/5 · 100 coins + a small bonus on first completion today
المستقبل a هو الذي يوفر this، بغض النظر عن أي كائن آخر بدأ الاستدعاء.
إصلاح خطأ الإخفاء باستخدام this:
- متغير العنصر
private String name; void setName(String name) { this.name = name; }— صحيح!this.name(الحقل) يحصل على قيمةname(المعامل).
انقل الاستدلال إلى حالة جديدة
- تتبع a و b كطلاب تم إنشاؤهما بشكل منفصل تحملان الأسماء Ada و Bo.
a.setName("Cy")يغير a إلى Cy بينما يبقى b كما هو Bo. إذا كان alias=a، فإنalias.setName("Di")يغير نفس الكائن الأول، لذا يصبح قراءة a هي Di. - المستقبل هو الكائن الذي تعمل عليه الدالة العضو، وليس بالضرورة الكائن الذي استدعى الكود الخاص به. يمكن للدالة الساكنة العمل على إشارة كائن صريحة، لكن ليس لديها this ضمنية.
this تشير إلى العنصر الحالي — العنصر الذي استُدعيَت عليه دالة عنصرية. استخدامها الرئيسي هو حل الإخفاء: this.name = name; يعامِل المعامل إلى متغير العنصر. كل دالة عنصرية تمتلك this ضمنيًا، لكن الدالة الثابتة ليس لديها أي، لذا لا يمكن استخدام this هناك.