JavaRush /مدونة جافا /Random-AR /الكلمة الرئيسية هذه {في الأمثلة}

الكلمة الرئيسية هذه {في الأمثلة}

نشرت في المجموعة
في JavaRush، يتم تعريف الطلاب بالكلمة الرئيسية حرفيًا من المحاضرات الأولى this. ومع مرور الوقت يصبح واضحا ما يعنيه. لكن الكثيرين، إذا نظروا إلى الوراء، ربما يقولون لأنفسهم بصدق أنهم لم يتمكنوا من تحقيق زن هذه الكلمة الرئيسية لفترة طويلة. في هذه المقالة نكشف النقاب عن الأسرار المتعلقة باستخدام الكلمات الرئيسية thisلأولئك الذين ما زالوا غير قادرين على اكتشافها... مرحبًا! إذا اخترت كتاب Java المرجعي الخاص بـ Schildt ، فستقرأ في الصفحة 171 أن الكلمة الأساسية thisمطلوبة حتى تتمكن الطريقة من الرجوع إلى الكائن الذي يطلق عليها. يمكن أن يكون هذا في الواقع نهاية الأمر. لكننا بحاجة إلى تفاصيل. الكلمة الرئيسية هذه {في الأمثلة} - 1وكقاعدة عامة، thisينبغي استخدامه في حالتين:
  1. عندما يكون لمتغير مثيل الفئة ومتغير الطريقة/المنشئ نفس الاسم؛
  2. عندما تحتاج إلى استدعاء مُنشئ من نوع واحد (على سبيل المثال، مُنشئ افتراضي أو ذو معلمات) من نوع آخر. وهذا ما يسمى أيضًا استدعاء منشئ صريح.
هذا كل شيء، ليس كثيرًا حقًا، فقط حالتان تم استخدام هذه الكلمة الرئيسية المخيفة فيها. الآن دعونا نلقي نظرة على هذين الموقفين مع الأمثلة.

المثال الأول - متغير المثيل ومتغير الأسلوب لهما نفس الاسم

لنفترض أن لدينا فئة Humanتم تحديد حقل "الاسم" لها: الكلمة الرئيسية هذه {في الأمثلة} - 2لنقم nameبإنشاء أداة ضبط للمتغير (أداة الضبط تعمل تمامًا ولا توجد خدعة هنا): يرجى ملاحظة أننا نقوم بتمرير المتغير الكلمة الرئيسية هذه {في الأمثلة} - 3إلى الطريقة (أداة الضبط ) . لقد قدمنا ​​متغيرًا جديدًا ويمكننا (بشكل عام) تسميته كما أردنا لأنه سيكون مرئيًا فقط داخل الأقواس المتعرجة للطريقة . لاحظ أن هناك سطرًا واحدًا في أداة الضبط: setNameString newNamesetName
name = newName;
أي أننا، في الواقع، قدمنا ​​متغيرًا جديدًا newNameوقمنا بتخصيصه لمتغير موجود بالفعل في الفصل name. اعتقد العديد من المبرمجين أنه من الغريب تقديم متغير باسم جديد إذا كنا نتحدث في النهاية عن نفس الشيء. حول الاسم في الفصل Human. ولذلك، فكر مطورو اللغة في جعل استخدام اسم متغير واحد مناسبًا. وبعبارة أخرى، لماذا يكون هناك اسمان للمتغير الذي يعني نفس الشيء. أي أنني أود أن أفعل شيئًا كهذا: الكلمة الرئيسية {في الأمثلة} - 4ولكن في هذه الحالة تنشأ مشكلة . لدينا الآن متغيران يحملان نفس الاسم. أحدهما String nameينتمي إلى الفصل Humanوالآخر String nameإلى طريقته setName. لذلك، لا يعرف جهاز Java المتغير الذي تقصده عندما تكتب سلسلة في أداة ضبط:
name = name;
تأخذ Java الأقرب - nameمن الطريقة setName:
الكلمة الرئيسية هذه {في الأمثلة} - 5
واتضح أنك ببساطة تقوم بتعيين قيمة لمتغير nameمن هذه الطريقة إليه. وهذا بالطبع لا معنى له. ولذلك، كانت هناك حاجة إلى طريقة ما لتمييز متغير nameمن فئة Humanمن متغير nameمن طريقة setName. لحل هذه المشكلة، تم تقديم الكلمة الأساسية this، والتي في هذه الحالة سوف تشير إلى أنه من الضروري استدعاء متغير ليس من الأسلوب، ولكن من فئة Human:
الكلمة الرئيسية {في الأمثلة} - 6
أي thisأنه سيشير إلى الكائن المستدعي، كما قيل في بداية المقال. setNameونتيجة لذلك، سيتم تعيين اسم الشخص من خلال أداة الضبط إلى الكائن الذي تم إنشاؤه. يوجد أدناه الرمز دون استخدام الكلمة الأساسية this. يقوم الكود بإنشاء كائن فئة Humanويعطيه اسمًا:
الكلمة الرئيسية هذه {في الأمثلة} - 7
وفيما يلي رمز البرنامج مع الكلمة الأساسية 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 في Java تُستخدم فقط كجزء من الأساليب أو المنشئات لمثيل الفئة. ولكن ضمنيًا، يتم تمرير الكلمة الأساسية thisإلى جميع الطرق باستثناء الطرق الثابتة (ولهذا السبب thisيطلق عليها غالبًا معلمة ضمنية) ويمكن استخدامها للإشارة إلى الكائن الذي يسمى الطريقة. ليست هناك حاجة للخوف من هذه الكلمة الرئيسية، لأنها Thisليست مخيفة.
الكلمة الرئيسية هذه {في الأمثلة} - 9
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION