آموزش کلید واژه ی this در جاوا (به زبان ساده)
در این آموزش با کلید واژه this در جاوا آشنا می شوید؛ چگونه و کجا استفاده شدن آن را با کمک مثال می آموزید.
کلید واژه ی this
در جاوا ، this به شی فعلی موجود در متد ها یا سازنده ها اشاره دارد. بیایید برای اثبات آن مثالی بزنیم.
- class MyClass {
- int instVar;
- MyClass(int instVar){
- this.instVar = instVar;
- System.out.println(“this reference = ” + this);
- }
- public static void main(String[] args) {
- MyClass obj = new MyClass(8);
- System.out.println(“object reference = ” + obj);
- }
- }
خروجی
this reference = com.ThisAndThat.MyClass@74a14482
object reference = com.ThisAndThat.MyClass@74a14482
توجه کنید که شناسه شیء obj و this یکی است. معنای this چیزی نیست جز اشاره به شی فعلی.
۳ موقعیت وجود دارد که معمولاً از این کلید واژه استفاده می شود.
۱- استفاده از this برای تفکیک منابع مختلف متغیر
در جاوا مجاز به تعریف دو یا چند متغیر با یک نام مشابه در یک دامنه (دامنه کلاس یا دامنه متد) نیستید. با این حال ، متغیرها و پارامترهای نمونه ممکن است دارای نام یکسان باشند. مانند:
class MyClass {
int instVar; // instVar instance variable
MyClass(int instVar){ // instVar parameter
instVar = instVar;
}
}
در برنامه بالا کامپایلر جاوا به دلیل ابهام نام دچار اشتباه می شود. از این رو برای رفع این مشکل از کلید واژه this استفاده می شود.
بیایید یک مثال را بدون استفاده از کلمه کلیدی this ببینیم:
- class MyClass {
- int instVar;
- MyClass(int instVar){
- instVar = instVar;
- }
- public static void main(String[] args) {
- MyClass mc = new MyClass(8);
- System.out.println(“mc.instVar = ” + mc.instVar);
- }
- }
خروجی
mc.instVar = 0
ممکن است انتظار داشته باشید که خروجی ۸ باشد ، اما در عوض ۰ را چاپ کرد زیرا کامپایلر جاوا به دلیل ابهام در نام بین متغیر نمونه و پارامتر سازنده اشتباه می کند.
حال ، اجازه دهید کد فوق را بازنویسی کنیم و از کلید واژه ی this برای حل این مسئله استفاده کنیم.
- class MyClass{
- int instVar;
- MyClass(int instVar){
- this.instVar = instVar;
- }
- public static void main(String[] args) {
- MyClass obj = new MyClass(8);
- System.out.println(“obj.instVar = ” + obj.instVar);
- }
- }
خروجی
mc.instVar = 8
اکنون ، خروجی مورد انتظار را خواهید گرفت. به این دلیل که وقتی شما یک شیء ایجاد می کنید ، کامپایلر جاوا می داند کدام شیء از سازنده استفاده کرده است.
وقتی کامپایلر جاوا سازنده را فراخوانی می کند ، this در داخل سازنده با شی ای که سازنده را صدا زده جایگزین می شود.
توجه: اگر پارامتری را ارسال کنید که دارای اسم متفاوت از متغیرهای نمونه باشد ، کامپایلر بطور خودکار کلمه کلیدی this را ضمیمه می کند.
این کد
class MyClass {
int instVar;
جاوا، جاوا اسکریپت رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی عالی با توسعه وب، ماشین لرنینگ و ... کتابخانه های پیشرفته جاوا اسکریپت و ... دانلود:
MyClass(int i) {
instVar = i;
}
}
برابر است با:
class MyClass {
int instVar;
MyClass(int i) {
this.instVar = i;
}
}
یکی دیگر از کاربردهای متداول کلمه کلیدی this در متد های get و set یک کلاس است. مثلا:
- class POJO {
- String name;
- void setName( String name ) {
- this.name = name;
- }
- String getName(){
- return this.name;
- }
- public static void main( String[] args ) {
- POJO pojo = new POJO();
- pojo.setName(“Toshiba”);
- System.out.println(“pojo.name: “+pojo.getName());
- }
- }
خروجی
pojo.name: Toshiba
۲- استفاده از this در سربارگذاری سازنده ها
در حین کار با سربارگذاری سازنده ها، شاید فراخوانی یک سازنده از سازنده دیگر مفید تر باشد. اما ، سازندگان را نمی توان صریح فراخواند. از این رو ، برای تحقق این هدف می توانید از شکل دیگری از کلمه کلیدی this استفاده کنید. (()this)
شبه کد در اینجا نشان داده شده است:
this(arg-list)
در اینجا نحوه استفاده از this در فراخوانی سازنده آمده است.
- class Complex {
- private int a, b;
- // parameterize constructor
- private Complex( int i, int j ){
- this.a = i;
- this.b = j;
- }
- private Complex(int i){
- this(i, i); // invokes Complex(int i, int j);
- }
- private Complex(){
- this(0); // invokes Complex(int i);
- }
- @Override
- public String toString(){
- return this.a + ” + ” + this.b + “i”;
- }
- public static void main( String[] args ) {
- Complex c1 = new Complex(2, 3);
- Complex c2 = new Complex(3);
- Complex c3 = new Complex();
- System.out.println(c1);
- System.out.println(c2);
- System.out.println(c3);
- }
- }
خروجی
۲ + ۳i
۳ + ۳i
۰ + ۰i
در برنامه بالا ، مهم نیست که در هنگام معرفی شیء کدام سازنده فراخوانی می شود ، در نهایت سازنده پارامتری صدا زده می شود.
هنگام استفاده از ()this باید مراقب باشید. سازنده هایی که ()this را صدا می زنند به کندی اجرا می شوند زیرا صدا زدن سازنده اضافه دیگر سربار اضافه می کند. اگر کلاس شما فقط برای ایجاد تعداد انگشت شماری از اشیاء استفاده می شود ، استفاده از ()this مفید است. یکی دیگر از مزیت های بزرگ استفاده از ()this کاهش میزان کد کپی و تکراری است.
۳- ارسال this به عنوان آرگومان
اگر لازم است شیء فعلی را به عنوان یک آرگومان به یک متد منتقل کنید ، می توانید از this استفاده کنید.
- class ThisExample {
- int x;
- int y;
- ThisExample(int x, int y) {
- this.x = x;
- this.y = y;
- System.out.println(“Before passing this to addTwo() method:”);
- System.out.println(“x = ” + this.x + “, y = ” + this.y);
- addTwo(this);
- System.out.println(“After passing this to addTwo() method:”);
- System.out.println(“x = ” + this.x + “, y = ” + this.y);
- }
- void addTwo(ThisExample o){
- o.x += 2;
- o.y += 2;
- }
- }
- class Demo {
- public static void main( String[] args ) {
- ThisExample obj = new ThisExample(1, -2);
- }
- }
خروجی
Before passing this to addTwo() method:
x = 1, y = -2
After passing this to addTwo() method:
x = 3, y = 0
در اینجا ، متد ()addTwo با this به عنوان یک آرگومان از داخل سازنده صدا زده می شود.