در این آموزش قصد داریم تا کلیدواژۀ final
را معرفی کرده و با کاربرد آن در زبان برنامهنویسی جاوا در قالب چند مثال کاربردی آشنا شویم. به طور کلی، کیورد final
را میتوان برای تعریف کلاسها، متدها و متغیرها مورد استفاده قرار داد که در ادامه به معرفی کاربرد آن در هر یک از موارد مذکور میپردازیم:
- جهت تعریف کلاس: استفاده از این کلیدواژه برای کلاس منجر بدین میگردد تا هیچ کلاسی نتواند از آن کلاس ارثبری کند. به عبارت دیگر، با استفاده از کیورد
final
در کنار نام کلاس یکی از مهمترین قابلیتهای زبان برنامهنویسی جاوا که یک زبان شیئگرا میباشد را از دست میدهیم! - جهت تعریف متد: ذکر کیورد
final
به همراه نام متدها نیز موجب میشود تا دیگر نتوانیم متد مورد نظر را به اصطلاح Override نماییم (در آموزش بررسی مفهوم وراثت در قالب پروژۀ ارثبری فرزندان از خصوصیات پدر در زبان جاوا به طور کامل مفهوم اُورراید را در قالب مثال توضیح دادهایم.) و بدین ترتیب نوع کاری که متد مذکور انجام میدهد را نمیتوانیم تغییر دهیم. - جهت تعریف متغیر: مورد سوم استفاده از کلیدواژۀ
final
در ارتباط با نامگذاری متغیرها میباشد. در حقیقت، زمانی که کلیدواژۀfinal
را در کنار نام متغیری بنویسیم که دارای مقدار اولیه است، مقدار اولیۀ آن متغیر به اصطلاح نهایی شده و دیگر به هیچ وجه امکان اختصاص یک مقدار جدید به آن را نخواهیم داشت و توجه داشته باشیم که با استفاده از هر دو کیوردfinal
وstatic
میتوان متغیرهایی با مقدار اولیۀ ثابت تعریف کرد اما همانطور که در آموزش قبل اشاره کردیم، میتوان گفت که تفاوت این دو کیورد در این است که متغیرهای استاتیک قابلیت دسترسی مستقل از آبجکت ساختهشده از روی کلاس مربوطه را دارند.
حال به منظور درک بهتر مطالب تئوری فوق، پروژهای تحت عنوان Final ایجاد کرده و در آن کلاسی به نام WhatIsFinal
ایجاد میکنیم (به خاطر داشته باشیم که در حین ساخت این کلاس تیک گزینۀ public static void main را نزنیم چرا که این کلاس به منزلۀ کلاس اجرایی ما نخواهد بود.) بنابراین در ابتدا کدی به صورت زیر خواهیم داشت:
public class WhatIsFinal {
}
در ادامه متدی در این کلاس ایجاد میکنیم که وظیفۀ آن به نمایش در آوردن نام، نام خانوادگی و تاریخ تولد تعریفشده برای کاربر میباشد و برای این منظور کد فوق را به شکل زیر تکمیل میکنیم:
public class WhatIsFinal {
public void showData() {
String name = "Behzad";
String lastName = "Moradi";
int dateOfBirth = 1362;
System.out.println(name + "\n" + lastName + "\n" + dateOfBirth);
}
}
در کد فوق، متدی تحت عنوان ()showData
تعریف کرده و دو آبجکت از روی کلاس String
تحت عناوین name
و lastName
در آن ایجاد کردهایم و در نهایت با استفاده از دیتا تایپ int
متغیری به نام dateOfBirth
تعریف نمودهایم و همانطور که میبینیم، به ترتیب مقادیر استرینگ «Behzad» و «Moradi» و همچنین عدد «1362» را به هر یک از آنها اختصاص دادهایم. در ادامه، به منظور نمایش دادن این اطلاعات در بخش کنسول از متد ()println
استفاده کرده و هر یک از متغیرهای فوقالذکر را به عنوان آرگومان ورودی به آن پاس دادهایم تا مقادیر منتسب به هر یک را در کنسول چاپ نماید. به علاوه، جهت چاپ هر یک از اطلاعات مربوط به نام، نام خانوادگی و سال تولد در سطرهای جداگانه از علائم n\
استفاده کردهایم و بدین ترتیب هر یک از اطلاعات مذکور در سه سطر جداگانه نمایش داده میشوند.
در ادامه، کلاس دیگری تحت عنوان ActionClass
داخل همان پروژه ایجاد کرده و در حین ساخت آن نیز تیک گزینۀ public static void main را میزنیم چرا که این کلاس قرار است تا به عنوان نقطۀ شروع برنامۀ ما باشد و از همین روی در ابتدا کد مربوط به این کلاس به صورت زیر خواهد بود:
public class ActionClass {
public static void main(String[] args) {
}
}
در این مرحله، نیاز است تا آبجکتی از روی کلاس WhatIsFinal
در کلاس ActionClass
ایجاد کنیم سپس با استفاده از این آبجکت به متد تعریفشده در آن کلاس دسترسی داشته و میتوانیم آن را فراخوانی نماییم که برای این منظور کد فوق را به شکل زیر تکمیل میکنیم:
public class ActionClass {
public static void main(String[] args) {
WhatIsFinal objectOne = new WhatIsFinal();
objectOne.showData();
}
}
در کد فوق، آبجکتی تحت عنوان objectOne
از روی کلاس WhatIsFinal
ساخته و در سطر بعد متد ()showData
از این کلاس را روی آبجکت مذکور فراخوانی نمودهایم. حال با اجرای برنامۀ فوق در خروجی خواهیم داشت:
Behzad
Moradi
1362
همانطور که میبینیم، متد ()showData
فراخوانی شده و اطلاعات مربوط به کاربر در کنسول چاپ شده است. در ادامه، یک کلاس دیگر تحت عنوان Change
در این پروژه ایجاد میکنیم و در ادامه دستورات آن را به نحوی تعریف میکنیم تا از کلاس WhatIsFinal
ارثبری نماید. برای این منظور، فایل کلاس Change
را باز کرده و کد مربوط به آن را به شکل زیر تکمیل میکنیم (جهت کسب اطلاعات بیشتر در رابطه با مفهوم وراثت، به آموزش آشنایی با مفهوم وراثت در زبان برنامهنویسی جاوا مراجعه نمایید):
public class Change extends WhatIsFinal {
}
همانطور که در آموزشهای پیشین توضیح دادیم، به منظور ارثبری یک کلاس از کلاس دیگر در زبان برنامهنویسی جاوا میباید پس از نام کلاس مورد نظر کلیدواژۀ extends
را نوشته سپس نام کلاسی را بنویسیم که میخواهیم از آن ارثبری کنیم. بنابراین از این پس کلاس Change
از تمامی خصوصیات کلاس WhatIsFinal
برخوردار میباشد اما در ادامه قصد داریم تا برخی از خصوصیاتی که کلاس Change
از این کلاس به ارث برده است را تغییر دهیم. در همین راستا، رفتار متد ()showData
از کلاس WhatIsFinal
را در کلاس Change
اُورراید مینماییم به طوری که خواهیم داشت:
public class Change extends WhatIsFinal {
@Override
public void showData() {
String name = "Iman";
String lastName = "Ahmadi";
int dateOfBirth = 1364;
System.out.println(name + "\n" + lastName + "\n" + dateOfBirth);
}
}
همانطور که در کد فوق میبینیم، برای اُورراید متد ()showData
ابتدا دستور Override@
را نوشته سپس نام متد را مینویسیم و در ادامه مقادیر منتسب به متغیرهای تعریفشده در متد ()showData
از کلاس WhatIsFinal
را به ترتیب به مقادیر «Ahmadi» ،«Iman» و عدد «1364» تغییر میدهیم. حال مجدد به کلاس ActionClass
بازگشته و در آن آبجکتی جدید از روی کلاس Change
ایجاد میکنیم به طوری که در کد زیر داریم:
public class ActionClass {
public static void main(String[] args) {
WhatIsFinal objectOne = new WhatIsFinal();
objectOne.showData();
Change objectTwo = new Change();
objectTwo.showData();
}
}
در کد فوق، آبجکتی از روی کلاس Change
تحت عنوان objectTwo
ایجاد کرده و در ادامه متد اُوررایدشدۀ ()showData
از این کلاس را روی آبجکت ساختهشده فراخوانی نمودهایم به طوری که در خروجی خواهیم داشت:
Behzad
Moradi
1362
Iman
Ahmadi
1364
همانطور که میبینیم، اطلاعات مربوط به هر دو آبجکت در سطرهای جداگانهای در کنسول چاپ شدهاند. تا به این مرحله از آموزش، کلاسی تحت عنوان WhatIsFinal
ایجاد کرده و اتریبیوتهای مورد نظر خود به همراه متدی جهت نمایش آنها در کنسول را بدان اضافه کردیم و در ادامه کلاسی به عنوان نقطۀ شروع برنامۀ خود تعریف کرده و آبجکتی از روی کلاس WhatIsFinal
در آن ایجاد کرده سپس متد تعریفشده در این کلاس را روی آبجکت مذکور فراخوانی نمودیم. در ادامه، کلاس دیگری تحت عنوان Change
تعریف کردیم تا از کلاس WhatIsFinal
ارثبری نماید سپس رفتار متد ()showData
از کلاس WhatIsFinal
را در این کلاس اُورراید نمودیم.
اکنون میخواهیم تأثیر کلیدواژۀ final
را در روند اجرای برنامه تست کنیم و همانطور که در ابتدای آموزش اشاره کردیم، کلیدواژۀ final
را میتوان برای تعریف متدها، کلاسها و همچنین متغیرها مورد استفاده قرار داد و از همین روی در ادامه قصد داریم تا تأثیر آن در تعریف موارد مذکور را مورد بررسی قرار دهیم.
بهکارگیری کیورد final در تعریف متدها
همانطور که پیشتر اشاره کردیم، بهکارگیری کیورد final
پیش از نام متدها موجب میشود تا متد مذکور قابلیت اُورراید کردن نداشته باشد و در همین راستا قصد داریم تا کیورد final
را پیش از متد ()showData
در کلاس WhatIsFinal
قرار داده و مجدداً آن را در کلاس Change
اُورراید نموده سپس در کلاس ActionClass
آن را فراخوانی نماییم. برای این منظور به کلاس WhatIsFinal
بازگشته و آن را به صورت زیر تغییر میدهیم:
public class WhatIsFinal {
public final void showData() {
String name = "Behzad";
String lastName = "Moradi";
int dateOfBirth = 1362;
System.out.println(name + "\n" + lastName + "\n" + dateOfBirth);
}
}
در کد فوق، پیش از نام متد کلیدواژۀ final
را نوشتهایم و به محض آنکه فایل مربوط به این کلاس را سِیو کنیم، آیدیای اکلیپس در فایل کلاس Change
دور نام متد اُوررایدشدۀ ()showData
نقطهچین قرار داده که با قرار دادن نشانگر ماوس خود روی آن، اروری در قالب عبارت زیر مشاهده میکنیم:
Cannot override the final method from WhatIsFinal
در واقع، ارور فوق حاکی از آن است که متد ()showData
یک متد final
بوده و اُورراید کردن آن امکانپذیر نمیباشد. در ادامه، آیدیای اکلیپس به منظور رفع ارور به وجود آمده راهکاری را بدین صورت پیشنهاد میدهد که کلیدواژۀ final
را از کنار نام متد ()showData
حذف کنیم که با انجام این کار نیز مشکل برنامه رفع میشود اما چنانچه با وجود ارور فوق برنامه را اجرا کنیم، پنجرهای در معرض دیدمان قرار میگیرد که نشاندهندۀ وجود ارور در برنامه بوده و حاوی دو دکمه میباشد که کلید Cancel به منظور متوقف کردن اجرای برنامه و دکمۀ دیگر تحت عنوان Proceed جهت ادامۀ اجرای آن میباشد که در این مورد با فشردن کلید Proceed با خروجی زیر مواجه خواهیم شد:
Behzad
Moradi
1362
Exception in thread "main" java.lang.VerifyError: class Change overrides final method WhatIsFinal.showData()V
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(Unknown Source)
at java.base/java.security.SecureClassLoader.defineClass(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(Unknown Source)
همانطور که میبینیم، اطلاعات مربوط به آبجکت ساختهشدۀ اول به خوبی نمایش داده شده است اما نمایش اطلاعات مرتبط با آبجکت دوم که در آن یک متد final
را اُورراید کردهایم با مشکل مواجه شده است.
بهکارگیری کیورد final در تعریف متغیرها
همانطور که پیشتر اشاره کردیم، بهکارگیری کیورد final
در کنار نام متغیرها منجر بدین میشود تا متغیر مورد نظر مقداری ثابت داشته باشد و دیگر نتوان در سایر نقاط برنامه آن را مجدداً مقداردهی کرد. در این مرحله قصد داریم تا کاربرد آن در نامگذاری متغیرها را مورد بررسی قرار دهیم که برای درک بهتر این موضوع، در پروژۀ Final کلاس جدیدی به نام JavaConstants
تعریف کرده و در حین ساخت کلاس نیز تیک گزینۀ public static void main را میزنیم که در ابتدا کدی به صورت زیر خواهیم داشت:
public class JavaConstants {
public static void main(String[] args) {
}
}
اساساً در دنیای واقعی همواره چیزهایی وجود دارند که مقادیر آنها ثابت بوده و هرگز تغییر نمیکنند که از آن جمله میتوان به تعداد ساعات یک روز اشاره کرد بدین معنی که تعداد ساعات یک روز همواره 24 ساعت است یا تعداد اضلاع یک مربع را میتوان نام برد به طوری که یک مربع به هیچ وجه بیش از 4 ضلع نمیتواند داشته باشد. در همین راستا، در ادامۀ آموزش تعداد ساعات یک روز را مد نظر قرار داده و برنامۀ خود را بر اساس آن مینویسیم:
public class JavaConstants {
public static void main(String[] args) {
int numberOfHoursInADay = 24;
}
}
در کد فوق، با استفاده از دیتا تایپ int
متغیری به نام numberOfHoursInADay
تعریف کردهایم و مقدار اولیۀ آن را معادل عدد 24 قرار دادهایم و در ادامه میخواهیم تا این متغیر را در پنجرۀ کنسول نمایش دهیم. برای همین منظور کد فوق را به صورت زیر تکمیل میکنیم:
public class JavaConstants {
public static void main(String[] args) {
int numberOfHoursInADay = 24;
System.out.println(numberOfHoursInADay);
}
}
با فراخوانی متد ()println
در کد فوق و پاس دادن متغیر numberOfHoursInADay
به آن، مقدار منتسب به متغیر مذکور در کنسول چاپ میشود به طوری که با اجرای برنامۀ فوق در خروجی خواهیم داشت:
24
همانطور که ملاحظه میکنیم، عدد 24 در کنسول چاپ شده است اما سؤالی که مطرح میشود این است که «آیا همانطور که در دنیای واقعی تعداد ساعات یک روز 24 ساعت بوده و غیرقابلتغییر است، در برنامۀ فوق نیز مقدار متغیر numberOfHoursInADay
غیرقابلتغییر میباشد؟» که در پاسخ بدین پرسش کد فوق را به صورت زیر تغییر میدهیم:
public class JavaConstants {
public static void main(String[] args) {
int numberOfHoursInADay = 24;
numberOfHoursInADay = 25;
System.out.println(numberOfHoursInADay);
}
}
همانطور که ملاحظه میکنیم، پس از اختصاص یک مقدار به متغیر numberOfHoursInADay
مجدداً نام متغیر را نوشته و این بار مقدار جدیدی را بدان اختصاص دادهایم و با اجرای برنامه در خروجی خواهیم داشت:
25
میبینیم که آخرین مقدار منتسب به متغیر numberOfHoursInADay
در کنسول چاپ شده است بدین معنی که مقدار اختصاصیافته به این متغیر به راحتی قابلتغییر میباشد که در صورت نیاز با استفاده از کیورد final
در کنار نام متغیر مد نظر خود میتوانیم چنین امکانی را محدود نماییم. بنابراین به منظور تعریف متغیر numberOfHoursInADay
به عنوان یک متغیر final
کد فوق را به صورت زیر ویرایش میکنیم:
public class JavaConstants {
public static void main(String[] args) {
final int NUMBER_OF_HOURS_IN_A_DAY = 24;
System.out.println(NUMBER_OF_HOURS_IN_A_DAY);
}
}
دو تغییر عمده در کد فوق اِعمال کردهایم که در ادامه به بررسی آنها میپردازیم. مورد اول این که کلیدواژۀ final
را به نام متغیر اضافه کرده و این تضمین را برای متغیر مذکور فراهم نمودهایم تا در سایر نقاط برنامه نتوان مقدار جدیدی به آن اختصاص داد و مورد دوم مربوط به نحوۀ نامگذاری متغیر میباشد که در آن به جای استفاده از سَبک نامگذاری camelCase کلیۀ حروف را به صورت بزرگ نوشته و آنها را با یک علامت _
از یکدیگر مجزا ساختهایم و در ادامه متغیر مذکور را به عنوان آرگومان ورودی به متد ()println
پاس دادهایم تا مقدار منتسب به آن در کنسول چاپ گردد و از این پس میتوان گفت که متغیر NUMBER_OF_HOURS_IN_A_DAY
یک به اصطلاح Constant در برنامه میباشد.
به علاوه، علت تغییر در نوع نامگذاری یک کانستنت نسبت متغیرهای تعریفشده در برنامههای نوشتهشده به زبان جاوا این است که در برنامۀ خود بتوانیم به سادگی مقادیر Constant را از متغیرها تشخیص دهیم و این یک سَبک قراردادی در میان برنامهنویسان جاوا در سرتاسر جهان است اما میتوانیم برای نامگذاری مقادیر کانستنت نیز از همان سبک نامگذاری camelCase بدون هیچ مشکلی استفاده نماییم.
به خاطر داشته باشید |
واژۀ Constant دارای معانی متعددی همچون «ثابت»، «پایدار»، «دائمی»، «استوار» و غیره است و به نظر میرسد که طراحان زبان برنامهنویسی جاوا نام مناسبی برای متغیرهایی که همواره دارای مقدار ثابتی میباشند انتخاب کردهاند. |
حال مجدد برنامۀ فوق را اجرا کرده به طوری که در خروجی خواهیم داشت:
24
همانطور که میبینیم، مقدار منتسب به متغیر NUMBER_OF_HOURS_IN_A_DAY
معادل عدد 24 در کنسول چاپ شده است. اکنون قصد داریم تا ببینیم آیا میتوان مقدار اولیۀ یک کانستنت یا به عبارت دیگر یک متغیر از جنس final
را تغییر داد یا خیر که برای این منظور کد فوق را به صورت زیر بازنویسی میکنیم:
public class JavaConstants {
public static void main(String[] args) {
final int NUMBER_OF_HOURS_IN_A_DAY = 24;
NUMBER_OF_HOURS_IN_A_DAY = 25;
System.out.println(NUMBER_OF_HOURS_IN_A_DAY);
}
}
حال برنامه را سِیو کرده و میبینیم که آیدیای اکلیپس واژۀ مربوط به نام متغیر در سطر چهارم را با رنگ قرمز مشخص کرده است بدین معنی که اروری در برنامه و مرتبط با این متغیر به وجود آمده است که با قرار دادن نشانگر ماوس خود روی آن، اروری در قالب عبارت زیر مشاهده خواهیم کرد:
The final local variable NUMBER_OF_HOURS_IN_A_DAY cannot be assigned. It must be blank and not using a compound assignment
در واقع، ارور فوق به این نکته اشاره دارد که مقدار جدیدی نمیتوان برای متغیری از جنس final
تحت عنوان NUMBER_OF_HOURS_IN_A_DAY
اختصاص داد. بنابراین محیط اکلیپس به منظور رفع ارور به وجود آمده راهکاری را پیشنهاد میدهد بدین صورت که کیورد final
را از کنار نام متغیر مذکور حذف کنیم تا مشکل برنامه برطرف گردد. اکنون چنانچه با وجود ارور فوقالذکر برنامه را اجرا نماییم، پنجرهای مبنی بر وجود مشکل در برنامه را مشاهده خواهیم کرد که مشابه مثال پیشین در این مورد نیز کلید Proceed را فشار میدهیم و برنامه اجرا میشود و خروجی آن به صورت زیر خواهد بود:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The final local variable NUMBER_OF_HOURS_IN_A_DAY cannot be assigned. It must be blank and not using a compound assignment
at JavaConstants.main(JavaConstants.java:4)
به طور خلاصه، پیغام خطای فوق حاکی از آن است که برنامه به درستی کامپایل نشده است چرا که کانستنت تعریفشده در آن مجدداً مقداردهی شده است.
حال پیش از پایان آموزش، چند نکتۀ ضروری در ارتباط با مقادیر کانستنت را تشریح مینماییم. به طور کلی، اگر بخواهیم تا در برنامۀ خود یک کانستنت داشته باشیم که توسط کلیۀ متدهای موجود در کلاس مربوطه قابلدسترسی باشد، نیاز است تا آن را داخل بدنۀ کلاس و خارج از تمامی متدهای تعریفشده در برنامه ایجاد کرده و مقداردهی نماییم. برای مثال، متغیر NUMBER_OF_HOURS_IN_A_DAY
در کلاس JavaConstants
را میتوان به شیوۀ زیر داخل کلاس مذکور تعریف نمود:
public class JavaConstants {
final int NUMBER_OF_HOURS_IN_A_DAY = 24;
}
بدین ترتیب در کد فوق متغیر NUMBER_OF_HOURS_IN_A_DAY
از تمامی متدهای تعریفشده در کلاس مربوطه قابلدسترسی میباشد اما چنانچه بخواهیم تا یک مقدار کانستنت فقط در سطح متد مورد نظر قابلدسترسی باشد، آن را داخل بدنۀ متد مربوطه تعریف میکنیم به طوری که برای مثال داریم:
public class JavaConstants {
public void showConstant() {
final int NUMBER_OF_HOURS_IN_A_DAY = 24;
}
}
همانطور که در کد فوق میبینیم، متغیر NUMBER_OF_HOURS_IN_A_DAY
را داخل متدی تحت عنوان ()showConstant
تعریف کردهایم و بدین ترتیب متغیر مذکور صرفاً داخل این متد قابلدسترسی میباشد. از سوی دیگر، اگر بخواهیم تا کانستنت مورد نظر از تمامی نقاط برنامه قابلدسترسی باشد، میتوانیم از کلیدواژۀ public
پیش از نام آن استفاده کنیم که برای مثال کد زیر را مد نظر قرار میدهیم:
public class JavaConstants {
public final int NUMBER_OF_HOURS_IN_A_DAY = 24;
}
بدین ترتیب متغیر NUMBER_OF_HOURS_IN_A_DAY
در کد فوق از تمامی نقاط برنامه در دسترس خواهد بود. حال چنانچه بخواهیم متغیری از جنس final
تعریف کنیم تا صرفاً محدود به کلاسی باشد که در آن تعریف شده است، میباید از کلیدواژۀ private
پیش از نام آن استفاده کنیم:
public class JavaConstants {
private final int NUMBER_OF_HOURS_IN_A_DAY = 24;
}
در واقع، در کد فوق یک کانستَنت به نام NUMBER_OF_HOURS_IN_A_DAY
با مقدار اولیۀ 24 و سطح دسترسی private
تعریف کردهایم که فقط از داخل کلاس JavaConstants
قابلدسترسی میباشد. در پایان، اگر بخواهیم تا مقدار کانستنت مورد نظر با دیگر بخشهای برنامۀ مربوطه به اشتراک گذاشته شود، به صورت زیر از کیورد static
در نامگذاری آن استفاده میکنیم:
public class JavaConstants {
static final int NUMBER_OF_HOURS_IN_A_DAY = 24;
}
در کد فوق، متغیری از جنس final
تعریف کردهایم که علاوه بر عدم توانایی بر مقداردهی مجدد آن در سایر نقاط برنامه، مقدار منتسب به این متغیر با دیگر بخشهای برنامه نیز به اشتراک گذاشته میشود (جهت کسب اطلاعات بیشتر در این مورد توصیه میکنیم به آموزش آشنایی با کلیدواژۀ static و کاربردهای آن در قالب پروژۀ ثبتنام متقاضیان در باشگاه در زبان جاوا مراجعه نمایید.)
به طور کلی، در این آموزش به معرفی کیورد final
پرداخته و کاربرد آن در تعریف متغیرها و متدها را مورد بررسی قرار دادیم و گفتیم که استفاده از این کیورد در تعریف متغیرها موجب میشود تا مقادیری ثابت داشته و نتوان در سایر نقاط برنامه آنها را مجدداً مقداردهی کرد. به علاوه، استفاده از این کیورد پیش از نام متدها نیز منجر بدین میگردد تا امکان اُورراید کردن متد مذکور را نداشته باشیم.