this
و
super
دو کلمه کلیدی خاص در جاوا هستند که به ترتیب نمونه فعلی یک کلاس و سوپرکلاس آن را نشان می دهند. برنامه نویسان جاوا اغلب این کلمات را اشتباه می گیرند و از ویژگی های خاص آنها آگاهی کمی نشان می دهند که اغلب در مصاحبه های Java Core در مورد آنها سؤال می شود. به عنوان مثال، چند سوالی که بلافاصله به ذهن خطور می کند در مورد
this
و
super
، آیا می توان به یک کلمه کلیدی
this
در جاوا معنای متفاوتی نسبت داد؟ و تفاوت بین کلمات کلیدی
this
و
super
در جاوا چیست. نمیدانم؟ خوب، من پاسخی را در اینجا نمی دهم - می توان آن را در انتهای مقاله یافت.
![تفاوت بین این و کلمات کلیدی فوق العاده در جاوا - 1]()
بنابراین، همانطور که در ابتدا گفتم، تفاوت اصلی بین
this
و
super
در جاوا این است که
this
نمونه فعلی یک کلاس را نشان می دهد، در حالی که
super
نمونه فعلی کلاس والد نشان می دهد. در اینجا یک مثال از استفاده از متغیرها آورده شده است
this
-
super
احتمالاً قبلاً نمونه هایی از فراخوانی سازنده های یکی از دیگری را دیده اید، به اصطلاح. فراخوانی سازنده ها در یک زنجیره، این امر از طریق استفاده از کلمات کلیدی
this
و
super
. در داخل یک کلاس، برای فراخوانی سازنده بدون آرگومان آن، از آن استفاده میشود
this()
، در حالی که
super()
از آن برای فراخوانی سازنده بدون آرگومان، یا همانطور که به آن سازنده پیشفرض کلاس والد نیز گفته میشود، استفاده میشود. به هر حال، به این ترتیب شما می توانید نه تنها یک سازنده بدون آرگومان، بلکه هر سازنده دیگری را با دادن پارامترهای مناسب به آن فراخوانی کنید. به زودی نمونه ای از این
this
استفاده را خواهیم دید
super
. همچنین در
this
جاوا
super
برای دسترسی به متغیرهای نمونه کلاس و والد آن استفاده می شود. در واقع، آنها را می توان بدون پیشوندها
super
و
this
, اما به شرطی که در بلوک فعلی چنین متغیرهایی با متغیرهای دیگر همپوشانی نداشته باشند. اگر حاوی متغیرهای محلی با نام های مشابه نباشد، در غیر این صورت باید از نام هایی با پیشوند استفاده کنید، اما این مهم نیست، زیرا در این شکل آنها حتی بیشتر خوانا هستند. یک مثال کلاسیک از این رویکرد، استفاده از آن
this
در داخل سازنده ای است که پارامتری همنام با متغیر نمونه می گیرد. بعداً در مقاله خواهیم فهمید که چه تفاوت های دیگری بین
super
و وجود دارد
this
و به چند نمونه از کاربرد آنها نگاه خواهیم کرد.
چقدر این و فوق العاده شبیه هم هستند
قبل از بررسی تفاوت بین کلمات کلیدی
this
و
super
, اجازه دهید برخی از شباهت های آنها را بررسی کنیم:
- هر دو
this
، و super
متغیرهای غیر ایستا هستند، بنابراین نمی توان آنها را در یک زمینه استاتیک استفاده کرد، به این معنی که نمی توان آنها را در روش اصلی استفاده کرد. این منجر به یک خطای زمان کامپایل می شود "یک متغیر غیر ایستا this
نمی تواند از یک زمینه ایستا ارجاع شود". همین اتفاق می افتد اگر از کلمه کلیدی در روش اصلی استفاده کنید super
.
- هر دو
this
، و super
می توانند در داخل سازنده ها برای فراخوانی سازنده های دیگر در یک زنجیره استفاده شوند، به عنوان مثال، this
() و super
() سازنده را بدون آرگومان های کلاس های ارث بری و والد فراخوانی می کنند.
در مثال زیر، ابتدا فراخوانی از یک سازنده بدون آرگومان کلاس B به سازنده ای از همان کلاس B ارسال می کنیم که یک پارامتر از نوع را می گیرد
String
، که به نوبه خود
super("")
سازنده یک آرگومان را از سوپرکلاس فراخوانی می کند.
class A{
A(){
System.out.println("Конструктор без аргументов класса A");
}
A(String args){
System.out.println("Конструктор с одним аргументом класса A");
}
}
class B extends A{
B(){
this("");
System.out.println("Конструктор без аргументов класса B");
}
B(String args){
super("");
System.out.println("Конструктор с одним аргументом класса B");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
}
}
خروجی: سازنده تک آرگومان کلاس A سازنده تک آرگومان کلاس B سازنده بدون آرگومان کلاس B
- در داخل سازنده
this
، و super
باید در همان ابتدا بالاتر از تمام عبارات دیگر ظاهر شود، در غیر این صورت کامپایلر یک پیغام خطا صادر می کند. که از آن نتیجه می شود که یک سازنده نمی تواند هر دو را داشته باشد this()
و super()
.
تفاوت بین سوپر و این
اکنون می دانیم که چگونه از کلمات کلیدی استفاده کنیم
super
و
this
دلیل نیاز آنها را درک می کنیم. اما گزینه دیگری برای استفاده از این کلمات کلیدی وجود دارد که من به آن اشاره نکردم - در کلاس های داخلی، جایی که با کمک آنها می توان به یک کلاس بیرونی با استفاده از فرم نمادگذاری Outer مراجعه کرد.
this
برای نمونه فعلی و بیرونی آن.
super
- برای پدر و مادرش فراموش نکنید که نام کلاس بیرونی را جایگزین Outer کنید. اکنون به طور خلاصه تفاوت های اصلی بین کلمات کلیدی
this
و
super
- یک متغیر
this
به نمونه فعلی کلاسی که در آن استفاده می شود اشاره دارد، در حالی که super
به نمونه فعلی کلاس والد اشاره دارد.
- هر سازنده، در غیاب فراخوانی صریح به سازنده های دیگر، به طور ضمنی
super()
سازنده بدون آرگومان کلاس والد خود را فراخوانی می کند، اما شما همیشه این گزینه را دارید که به طور صریح هر سازنده دیگری را با یا، this()
یا فراخوانی کنید super()
.
این احتمالاً تمام چیزی است که می توان در مورد تفاوت بین کلمات کلیدی
this
و
super
در جاوا و نحوه استفاده از آنها در برنامه ها گفت. همانطور که دیدیم، هدف اصلی آنها فراخوانی یک سازنده از سازنده دیگر و ارجاع به متغیرهای نمونه اعلام شده در کلاس فعلی و کلاس والد آن است. فراموش نکنید که اینها دقیقاً متغیرهای معمولی نیستند و اکنون - پاسخ سؤال من که در پاراگراف اول پرسیدم. خیر، به یک متغیر
this
نمی توان مقدار جدیدی نسبت داد زیرا نهایی اعلام شده است. می توانید سعی کنید این کار را در IDE انجام دهید - یک خطای کامپایل دریافت خواهید کرد "شما نمی توانید یک مقدار جدید را به یک متغیر اختصاص دهید
this
- نهایی اعلام می شود."
مقاله اصلی اینجا
GO TO FULL VERSION