مشخصات مقاله
آموزش کاربرد کلیدواژه ی this در Java
آموزش Java – کاربرد کلیدواژه ی this در Java
کلیدواژه ی this کاربردهای مختلفی در زبان دارد. در Java، کلیدواژه ی this به آبجکت جاری (آبجکتی که در آن هستیم) اشاره دارد.
موارد استفاده ی کلیدواژه ی/اشاره گر this در Java
در زیر 6 مورد استفاده ی کلیدواژه ی this در Java را مشاهده می کنید:
- می تواند به instance variable کلاس جاری اشاره داشته باشد.
- می تواند برای فراخوانی متد کلاس جاری (به صورت ضمنی) بکار رود.
- ()this می تواند برای فراخوانی تابع سازنده ی کلاس جاری بکار رود.
- می تواند به عنوان آرگومان در فراخوانی متد بکار گرفته شود.
- می تواند به عنوان آرگومان به فراخوانی تابع سازنده بکار رود.
- this می تواند برای بازگردانی نمونه ی جاری کلاس از متد بکار رود.
اگر به تازگی شروع به یادگیری زبان Java کرده اید، بهتر است تنها 3 مورد کاربرد آن را یاد بگیرید.

استفاده از this برای اشاره به instance variable کلاس جاری
کلیدواژه ی this می تواند برای اشاره به (متغیری که خارج از بدنه ی متد و داخل کلاس تعریف شده) instance variable از نمونه ی جاری کلاس بکار رود. اگر بین instance variable ها و پارامترهای تابع سازنده به دلیل هم نام بودن ابهامی به وجود آید، اشاره گر this مشکل را برطرف می سازد.
اگر از کلیدواژه ی this استفاده نکنیم، چه مشکلی به وجود می آید؟
به وسیله ی مثال زیر دلیل استفاده از اشاره گر this را شرح می دهیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Student{ int rollno; String name; float fee; Student(int rollno,String name,float fee){ rollno=rollno; name=name; fee=fee; } void display(){System.out.println(rollno+ " " +name+ " " +fee);} } class TestThis1{ public static void main(String args[]){ Student s1= new Student(111, "ankit" ,5000f); Student s2= new Student(112, "sumit" ,6000f); s1.display(); s2.display(); }} <button></button> |
خروجی:
1 2 3 | 0 null 0.0 0 null 0.0 <button></button> |
در مثال بالا می بینید که پارامترهای ارسالی به تابع سازنده و متغیرهای نمونه ی کلاس (instance variable) یکسان هستند. در کد زیر با استفاده از اشاره گر this بین متغیرهای محلی تابع سازنده و متغیرهای سراسری (instance variable) تمایز قائل می شویم. در واقع ما با استفاده از کلیدواژه ی this به کامپایلر اعلان می کنیم که منظور ما متغیرهای داخل بدنه ی متد نیست، بلکه متغیرهای تعریف شده در بالای کلاس (instance variable ها) می باشد.
برطرف کردن مشکل مثال بالا با استفاده از کلیدواژه ی this
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Student{ int rollno; String name; float fee; Student(int rollno,String name,float fee){ this.rollno=rollno; this.name=name; this.fee=fee; } void display(){System.out.println(rollno+ " " +name+ " " +fee);} } class TestThis2{ public static void main(String args[]){ Student s1= new Student(111, "ankit" ,5000f); Student s2= new Student(112, "sumit" ,6000f); s1.display(); s2.display(); }} <button></button> |
خروجی:
1 2 3 | 111 ankit 5000 112 sumit 6000 <button></button> |
اگر متغیرهای محلی (داخل متد) با متغیرهای تعریف شده در بدنه ی کلاس (instance variable) هم نام نباشند (متفاوت باشند)، در آن صورت هیچ نیازی به استفاده از اشاره گرthis در برنامه نیست. مانند مثال زیر:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Student{ int rollno; String name; float fee; Student(int r,String n,float f){ rollno=r; name=n; fee=f; } void display(){System.out.println(rollno+ " " +name+ " " +fee);} } class TestThis3{ public static void main(String args[]){ Student s1= new Student(111, "ankit" ,5000f); Student s2= new Student(112, "sumit" ,6000f); s1.display(); s2.display(); }} <button></button> |
خروجی:
1 2 3 | 111 ankit 5000 112 sumit 6000 <button></button> |
توصیه می شود همیشه از برای متغیرها اسامی معنی دار انتخاب نمایید. اگر مانند مثال اول از اسم یکسان برای متغیر سراسری کلاس (instance variable) و پارامترهای ارسالی به متد استفاده کنید، آنگاه مجبور به استفاده از کلیدواژه ی this جهت برطرف کردن ابهام برای کامپایلر خواهید شد.
کلیدواژه ی this جهت فراخوانی متد کلاس جاری
می توان با استفاده از کلیدواژه ی this، متد کلاس جاری را فراخوانی کرد. اگر از کلیدواژه ی this استفاده نکنید، کامپایلر به صورت خودکار به هنگام فراخوانی متد این کلیدواژه را اضافه می کند. در مثال زیر این امر را به صورت عملی نشان می دهیم:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class A{ void m(){System.out.println( "hello m" );} void n(){ System.out.println( "hello n" ); //m();//same as this.m() this.m(); } } class TestThis4{ public static void main(String args[]){ A a= new A(); a.n(); }} <button></button> |
خروجی:
1 2 3 | hello n hello m <button></button> |
استفاده از this جهت فراخوانی تابع سازنده ی کلاس جاری
تابع ()this به شما امکان می دهد تا تابع سازنده ی کلاس جاری را مجددا فراخوانی کنید. به عبارت ساده تر، برای فراخوانی پشت سرهم و زنجیره سازی تابع سازنده ی کلاس فعلی مورد استفاده قرار می گیرد.
فراخوانی تابع سازنده ی پیش فرض از تابع سازنده ی پارامتر دار
1 2 3 4 5 6 7 8 9 10 11 12 | class A{ A(){System.out.println( "hello a" );} A(int x){ this(); System.out.println(x); } } class TestThis5{ public static void main(String args[]){ A a= new A(10); }} <button></button> |
خروجی:
1 2 3 | hello a 10 <button></button> |
فراخوانی تابع سازنده ی پارامتردار از تابع سازنده ی پیش فرض:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class A{ A(){ this(5); System.out.println( "hello a" ); } A(int x){ System.out.println(x); } } class TestThis6{ public static void main(String args[]){ A a= new A(); }} <button></button> |
خروجی:
1 2 3 | 5 hello a <button></button> |
استفاده ی واقعی از تابع سازنده ی ()this
استفاده ی واقعی تابع this() زمانی است که بخواهید سازنده را از سازنده مجددا فراخوانی کنید. در واقع توابع سازنده را به صورت پشت سرهم و دنباله ای یا زنجیره ای فراخوانی می کند. در زیر استفاده ی کاربردی از کلیدواژه ی this را مشاهده می کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class Student{ int rollno; String name,course; float fee; Student(int rollno,String name,String course){ this.rollno=rollno; this.name=name; this.course=course; } Student(int rollno,String name,String course,float fee){ this(rollno,name,course); //reusing constructor this.fee=fee; } void display(){System.out.println(rollno+ " " +name+ " " +course+ " " +fee);} } class TestThis7{ public static void main(String args[]){ Student s1= new Student(111, "ankit" , "java" ); Student s2= new Student(112, "sumit" , "java" ,6000f); s1.display(); s2.display(); }} <button></button> |
خروجی:
1 2 3 | 111 ankit java null 112 sumit java 6000 <button></button> |
فراخوانی ()this باید اولین دستور در تابع سازنده باشد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class Student{ int rollno; String name,course; float fee; Student(int rollno,String name,String course){ this.rollno=rollno; this.name=name; this.course=course; } Student(int rollno,String name,String course,float fee){ this.fee=fee; this(rollno,name,course); //C.T.Error } void display(){System.out.println(rollno+ " " +name+ " " +course+ " " +fee);} } class TestThis8{ public static void main(String args[]){ Student s1= new Student(111, "ankit" , "java" ); Student s2= new Student(112, "sumit" , "java" ,6000f); s1.display(); s2.display(); }} <button></button> |
خروجی:
1 | Compile Time Error: Call to this must be first statement in constructor<button></button> |
ارسال this به عنوان آرگومان
کلیدواژه ی this خود می تواند به عنوان آرگومان به متد فرستاده شود. این مورد بیشتر در مدیریت رخدادها (event handling) بکار می رود. مثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 | class S2{ void m(S2 obj){ System.out.println( "method is invoked" ); } void p(){ m(this); } public static void main(String args[]){ S2 s1 = new S2(); s1.p(); } } <button></button> |
خروجی:
1 | method is invoked<button></button> |
موارد استفاده از this به عنوان آرگومان
در مدیریت رخدادها یا در شرایطی که لازم است اشاره گر به کلاسی را به کلاس دیگر ارسال کنید، می توانید this را به عنوان پارامتر به یک متد پاس دهید. در واقع می توان یک آبجکت را در چندین متد استفاده کرد.
ارسال this به عنوان آرگومان به تابع سازنده
اگر لازم باشد که از یک آبجکت در چندین کلاس استفاده نمایید، می توانید کلیدواژه ی this که اشاره گری به آبجکت مورد نظر است را به تابع constructor پاس دهید. بدین وسیله می توان یک آبجکت را در چندین کلاس بکار برد. مثال کاربردی:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class B{ A4 obj; B(A4 obj){ this.obj=obj; } void display(){ System.out.println(obj.data); //using data member of A4 class } } class A4{ int data=10; A4(){ B b= new B(this); b.display(); } public static void main(String args[]){ A4 a= new A4(); } } <button></button> |
خروجی:
1 | 10<button></button> |
استفاده از کلیدواژه ی this برای بازگردانی نمونه ی کلاس جاری
می توان اشاره گر this را با استفاده از دستور return به عنوان خروجی یک متد بازگرداند. در چنین شرایطی، نوع بازگشتی متد باید از جنس کلاس باشد (غیر primitive).
نحوه ی بازگرداندن this به عنوان خروجی متد:
1 2 3 4 | return_type method_name(){ return this; } <button></button> |
1 2 3 4 5 6 7 8 9 10 11 12 | class A{ A getA(){ return this; } void msg(){System.out.println( "Hello java" );} } class Test1{ public static void main(String args[]){ new A().getA().msg(); } } <button></button> |
خروجی:
1 | Hello java<button></button> |
در مثال زیر سعی داریم به شما ثابت کنیم که کلیدواژه ی this به instance variable کلاس جاری اشاره دارد.
در این برنامه، مقدار متغیر اشاره گر (آبجکت ساخته شده از روی کلاس) و کلیدواژه ی this را چاپ می کنیم.
همان طور که می بینید خروجی هر دو یکی است:
1 2 3 4 5 6 7 8 9 10 11 | class A5{ void m(){ System.out.println(this); //prints same reference ID } public static void main(String args[]){ A5 obj= new A5(); System.out.println(obj); //prints the reference ID obj.m(); } } <button></button> |
خروجی:
1 2 3 | A5@22b3ea59 A5@22b3ea59 <button></button> |