در CodeGym، دانش آموزان با این کلمه کلیدی به معنای واقعی کلمه از اولین درس ها با جاوا آشنا می شوند . با گذشت زمان معنای آن مشخص می شود. اما با نگاهی به گذشته، بسیاری از مردم احتمالاً به خود اعتراف می کنند که برای مدت طولانی نمی توانند ذن این کلمه کلیدی را درک کنند. این مقاله اسرار کلمه کلیدی این را برای هر کسی که هنوز نتوانسته است این کار را انجام دهد، باز خواهد کرد... من مرجع جاوای Schildt را
دارم ، سپس در صفحه 171 می توانید ببینید که این کلمه کلیدی برای یک متد برای ارجاع به شیئی که آن را فراخوانی کرده است مورد نیاز است. ما می توانیم درس را با آن تمام کنیم. اما ما نیاز به جزئیات داریم. به عنوان یک قاعده، شما باید از این در دو مورد استفاده کنید:
بنابراین معلوم میشود که شما به سادگی متغیر نام متد را به خودش اختصاص میدهید. که البته منطقی نیست بنابراین، زبان به روشی نیاز داشت تا متغیر نام کلاس Human را از متغیر نام در متد setName متمایز کند . این مشکل با معرفی کلمه کلیدی this حل شد ، که در این مورد نشان می دهد که شما قصد دارید به متغیر مرتبط با نمونه ای از کلاس Human ارجاع دهید ، نه متغیر موجود در متد: به عبارت دیگر، این به شیء فراخوانی اشاره دارد. در ابتدای مقاله به آن اشاره کردیم. در نتیجه متد setName نام شخص را روی شی ایجاد شده تنظیم می کند. در زیر کد برنامه بدون استفاده از این کلمه کلیدی آمده است. کد یک شی Human ایجاد می کند و یک نام به آن اختصاص می دهد: و در اینجا کد با کلمه کلیدی این است : ![کلمه کلیدی this (با مثال) - 4]()
- وقتی یک متغیر نمونه و متغیر متد/سازنده نام یکسانی دارند.
- هنگامی که شما نیاز به فراخوانی نوع خاصی از سازنده (به عنوان مثال، سازنده پیش فرض یا سازنده پارامتر) از نوع دیگری از سازنده دارید. به این فراخوانی سازنده صریح نیز می گویند.
مثال 1: یک متغیر نمونه و متغیر متد نام یکسانی دارند.
فرض کنید یک کلاس Human داریم که یک فیلد نام را تعریف می کند: بیایید یک تنظیم کننده برای متغیر نام ایجاد کنیم (تنظیم کننده کاملاً کاربردی است - اینجا هیچ چیزی وجود ندارد):class Human {
String name;
public void setName(String newName) {
name = newName;
}
}
توجه داشته باشید که String newName را به متد setName میدهیم. ما یک متغیر جدید اعلام کردیم و میتوانستیم آن را هرچه میخواهیم نامگذاری کنیم، زیرا فقط در پرانتزهای فرفری ({}) که متد setName را در بر میگیرند، قابل مشاهده است . توجه داشته باشید که تنظیم کننده دارای یک خط است:
name = newName;
در اینجا یک متغیر جدید به نام newName معرفی کردهایم و آن را به متغیر نام موجود شی اختصاص میدهیم . بسیاری از برنامه نویسان ممکن است زمانی که در نهایت در مورد همان چیزی صحبت می کنیم، معرفی یک متغیر با نام جدید عجیب باشد. یعنی در مورد فیلد نام در کلاس Human صحبت می کنیم . به همین دلیل است که سازندگان جاوا راهی برای استفاده راحت از همان نام متغیر اندیشیدند. به عبارت دیگر، چرا دو نام برای یک متغیر وجود دارد که نشان دهنده یک چیز است. به عبارت دیگر، ما می خواهیم چیزی شبیه به این انجام دهیم:
class Human {
String name;
public void setName(String name) {
name = name;
}
}
اما در اینجا با یک مشکل مواجه می شویم . اکنون دو متغیر با یک نام داریم. یک نام رشته متعلق به کلاس Human است، در حالی که نام رشته دیگر به متد setName آن تعلق دارد . در نتیجه، وقتی خط زیر را در تنظیم کننده می نویسید، JVM نمی داند به کدام متغیر اشاره می کنید:
name = name;
جاوا فرض میکند منظور شما نزدیکترین متغیر نام است، یعنی متغیری از متد setName : 


public class Solution {
public static void main(String[] args) {
Human human1 = new Human();
human1.setName("Vinny");
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);
}
}
بنابراین، این به ما امکان می دهد از معرفی متغیرهای جدید برای نشان دادن یک چیز خودداری کنیم، و کد را تمیزتر و کمتر با متغیرهای اضافی شلوغ می کند.
مثال 2: استفاده از این برای فراخوانی سازنده صریح
فراخوانی یک سازنده از سازنده دیگر زمانی می تواند مفید باشد که شما (به اندازه کافی عجیب) چندین سازنده دارید و نمی خواهید سازنده جدید کد اولیه سازی را که قبلاً در سازنده دیگری نوشته شده است کپی کند. سردرگم؟ آنقدرها هم که به نظر می رسد ترسناک نیست. به کد زیر نگاه کنید. دارای دو سازنده برای کلاس 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) {
// Call the constructor with two parameters
this(age, weight);
// and then initialize 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 then initialize the missing variable:
this.height = height;
انگار به سازنده سه پارامتری می گوییم:
- این سازنده دیگر را که دو پارامتر دارد فراخوانی کنید
- و سپس یک متغیر دیگر اضافه کنید.
GO TO FULL VERSION