در JavaRush، دانش آموزان به معنای واقعی کلمه از اولین سخنرانی ها با کلمه کلیدی آشنا می شوند
و معلوم می شود که شما به سادگی به یک متغیر
یعنی همان
و در زیر کد برنامه با کلمه کلیدی
this
. و با گذشت زمان مشخص می شود که چه معنایی دارد. اما بسیاری، با نگاهی به گذشته، احتمالاً صادقانه با خود خواهند گفت که برای مدت طولانی نمی توانند ذن این کلمه کلیدی را درک کنند. در این مقاله ما پرده اسرار استفاده از کلمات کلیدی را this
برای کسانی که هنوز نمی توانند آن را بفهمند برمی داریم... خوش آمدید! اگر کتاب مرجع جاوا Schildt را بردارید ، در صفحه 171 خواهید خواند که یک کلمه کلیدی this
لازم است تا یک روش بتواند به شیئی که آن را فراخوانی کرده است ارجاع دهد. این در واقع می تواند پایان آن باشد. اما ما نیاز به جزئیات داریم. به عنوان یک قاعده، this
باید در دو مورد استفاده شود:
- هنگامی که یک متغیر نمونه کلاس و یک متغیر متد/سازنده نام یکسانی دارند.
- زمانی که نیاز دارید سازنده ای از یک نوع (مثلاً سازنده پیش فرض یا پارامتری) را از دیگری فراخوانی کنید. به این فراخوانی سازنده صریح نیز می گویند.
مثال اول - متغیر نمونه و متغیر متد یک نام دارند
فرض کنید یک کلاس داریمHuman
که فیلد "name" برای آن تعریف شده است: بیایید name
یک setter برای متغیر ایجاد کنیم (setter کاملاً کار می کند و هیچ ترفندی در اینجا وجود ندارد): لطفاً توجه داشته باشید که متغیر را به متد (setter) می setName
دهیم. ) String newName
. ما یک متغیر جدید معرفی کردیم و (به طور کلی) میتوانیم آن را هر چه میخواهیم بنامیم، زیرا فقط در {پرانتزهای فرفری} متد قابل مشاهده است setName
. توجه داشته باشید که یک خط در تنظیم کننده وجود دارد:
name = newName;
یعنی در واقع ما یک متغیر جدید معرفی کردیم newName
و آن را به متغیری که قبلاً در کلاس وجود داشت نسبت دادیم name
. بسیاری از برنامه نویسان تصور می کردند که معرفی یک متغیر با نام جدید عجیب است اگر در پایان ما در مورد همان چیزی صحبت می کنیم. Human
در مورد نام در کلاس بنابراین، توسعه دهندگان زبان به این فکر کردند که استفاده از یک نام متغیر را راحت کنند. به عبارت دیگر، چرا باید دو نام برای یک متغیر به معنای یکسان باشد. یعنی من می خواهم این کار را انجام دهم: اما در این صورت یک مشکل پیش می آید . اکنون دو متغیر داریم که یکسان نامگذاری شده اند. یکی String name
به کلاس Human
و دیگری String name
به متد آن تعلق دارد setName
. بنابراین، ماشین جاوا هنگام نوشتن یک رشته در یک ستتر نمی داند که منظور شما کدام متغیر است:
name = name;
جاوا نزدیکترین را می گیرد - 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