Final چیست و چگونه کار می‌کند؟

من ارسلان میربزرگی، قصد دارم تا شما را با کلید واژه final و کاربرد آن در برنامه نویسی جاوا آشنا کنم. زبان برنامه نویسی جاوا یکی از پرکاربردترین زبان های برنامه نویسی است که در مقالات قبلی در مورد آن صحبت کرده ایم.

کلید واژه final در جاوا

در زبان برنامه نویسی جاوا، می‌توان از کلید واژه final به منظور تعریف کلاس‌ها، متغیرها و متدها استفاده کرد.

تعریف کلاس

اگر کلیدواژه final را در یک کلاس در جاوا استفاده کنید، هیچ کلاس دیگری قادر به  ارث‌ بری از آن کلاس نخواهد بود. در واقع با این کار یکی از با اهمیت‌ترین قابلیت های زبان برنامه نویسی جاوا را از دست خواهید داد.

تعریف متد

اگر کلید واژه final به همراه با نام متد آورده شود، دیگر نمی‌توانیم این متد را Override کنیم و نمی توانیم نوع کاری را که آن متد انجام می دهد تغییر دهیم.

جهت تعریف متغیر

 اگر کلیدواژه final را در نامگذاری یک متغیر که دارای یک مقدار اولیه است، به کار ببریم، مقدار این متغیر  نهایی می‍‌‌‌شود و دیگر امکان تغییر دادن این مقدار به یک مقدار جدید وجود ندارد. با هر دو کلیدواژه final و static می‌توانید متغیرهایی را با یک مقدار اولیه ثابت تعریف کنید. تفاوت این دو کلید واژه صرفا در این است که متغیرهای static  توانایی دسترسی به صورت مستقل به object تولید ‌شده از روی یک کلاس را دارند.
برای اینکه بهتر درک کنید که کلید واژه final در جاوا چطور عمل می کند، با یکدیگر مثالی را مرور می کنیم. ابتدا پروژه ای را به نام final ساخته و در آن کلاسی ار به نام WhatIsFinal می سازیم. ( توجه داشته باشید که در طول ساخت این کلاس، نباید تیک مربوط به گزینه public static void main را بزنیم. دلیل این کار نیز این است که این کلاس، کلاس اجرایی نمی باشد. ). کد ابتدایی ما به  صورت زیر است:
 public class WhatIsFinal {


}

 

سپس در این کلاس متدی را میسازیم. وظیفه این متد، نمایش نام، نام خانوادگی و تاریخ تولید هر کاربر است. برای این کار، کد زیر را اضافه می کنیم.
public class WhatIsFinal {
    public void showData() {
        String name = "Arsalan";
        String lastName = "Mirbozorgi";
        int dateOfBirth = 1362;
        System.out.println(name + "\n" + lastName + "\n" + dateOfBirth);
    }
}

در این کد، متدی با نام ()showData تعریف شده و سپس دو object از روی کلاس String با نام های name و lastName در آن ایجاد کردیم. در آخر نیز با استفاده از دیتا تایپ int، متغیری را با نام dateOfBirth تعریف کردیم . مقادیر استرینگ «Arsalan» و «Mirbozorgi» و عدد «1365» را به هر کدام از آن‌ها اختصاص دادیم. برای نمایش این اطلاعات در قسمت کنسول از متد ()println استفاده کردیم و هر کدام از متغیرهایی که ذکر کردیم را به عنوان یک آرگومان ورودی به آن ارجاع داده‌ایم. در این صورت، مقادیر منتسب به  هر کدام را در کنسول چاپ می کند. برای چاپ هر کدام از اطلاعاتی که مربوط به نام، نام خانوادگی و سال تولد در خط های جداگانه، از علامت n\ استفاده می‌کنیم . در این صورت این اطلاعات در سه خط جدا از هم نمایش داده می‌شوند.

کلاس دیگری با نام ActionClass را در داخل همان پروژه قبلی‌ ایجاد میکنیم و این بار تیک گزینه public static void main را میزنیم چون می خواهیم این کلاس، کلاس اجرایی ما باشد. کد مربوط به این کلاس به شکل زیر است:

public class ActionClass {
    public static void main(String[] args) {
    }
}

 

در این قسمت باید، یک object را از روی کلاس WhatIsFinal ، در کلاس ActionClass بسازیم. پس از آن با استفاده از این  object، به متدی که در آن کلاس تعریف کردیم، دسترسی داریم و می‌توانیم آن را فراخوانی کنیم. کد لازم برای این کار به شکل زیر نوشته می‌شود:
public class ActionClass {
    public static void main(String[] args) {
        WhatIsFinal objectOne = new WhatIsFinal();
        objectOne.showData();
    }
}

 

در این کد، یک object با نام objectOne را از روی کلاس WhatIsFinal میسازیم و در خط بعدی، متد ()showData را ساز این کلاس  و بر روی object ذکر شده فراخوانی میکنیم. در این صورت خروجی زیر به ما تحویل داده می شود :
Arsalan
Mirbozorgi
1365

 

مشاهده کردید که متد ()showData فراخوانی شد و پس از آن، اطلاعات کاربر چاپ شد. حالا کلاس دیگری با نام Change را در این پروژه‌ میسازیم و دستورات آن را به شکلی تعریف می‌کنیم تا این کلاس از کلاس WhatIsFinal ارث ‌بری کند. برای این کار، باید فایل کلاس Change را باز کنیم و کد مربوط به آن را به صورت زیر تکمیل کنیم :
public class Change extends WhatIsFinal {

}

 

در زبان برنامه‌نویسی جاوا، برای ارث ‌بری کلاسی از یک کلاس دیگر، باید پس از نام کلاس، ابتدا کلید واژه  extends و پس از آن، نام کلاسی را که می‌خواهیم از آن ارث ‌بری کنیم را بنویسیم. در این صورت کلاس Change از همه ویژگی های کلاس WhatIsFinal برخوردار می شود. در ادامه می خواهیم بعضی از ویژگی‌هایی را که کلاس Change از کلاس WhatIsFinal به ارث برده را تغییر دهیم. به این منظور، باید رفتار متد ()showData از کلاس WhatIsFinal را در کلاس Change ، Override کنیم که در این صورت به نتیجه زیر میرسیم :
public class Change extends WhatIsFinal {
    @Override
    public void showData() {
        String name = "Ali";
        String lastName = "Asadi";
        int dateOfBirth = 1367;
        System.out.println(name + "\n" + lastName + "\n" + dateOfBirth);
    }
}

 

برای Override متد ()showData ، باید در ابتدا دستور [email protected] را نوشته و پس از آن، نام متد را بنویسیم و در ادامه آن، مقادیری را که به متغیرهای تعریف‌شده در متد ()showData نسبت داده شده، را تغییر دهیم که در این مورد، در کلاس WhatIsFinal این مقادیر را به ترتیب به مقادیر «  Ali» و  « Asadi » و عدد «1367» تغییر میدهیم. سپس دوباره به کلاس ActionClass برمیگردیم و در آن کلاس object جدیدی را از روی کلاس Change میسازیم. نتیجه این کار به شکل زیر است :
public class ActionClass {
    public static void main(String[] args) {
        WhatIsFinal objectOne = new WhatIsFinal();
        objectOne.showData();
        Change objectTwo = new Change();
        objectTwo.showData();
    }
}

 

در این کد، یک object از روی کلاس Change با نام objectTwo ساخته می شود و در ادامه متد Override شده ()showData  از این کلاس را، روی object ایجاد ‌شده فراخوانی می‌کنیم. خروجی این کار به صورت زیر است :
Arsalan
Mirbozorgi
1365
Ali
Asadi
1367

 

پس از این مرحله، اطلاعاتی که مربوط به هر دو object است، در خط‌های جدا از هم، چاپ میشود. تا این مرحله از مقاله final و کاربردهای آن در زبان برنامه‌نویسی جاوا، کلاسی را با نام WhatIsFinal ساخته و Attribute ‌های مورد نظر خود را همراه با متدی برای نمایش آنها، به آن اضافه کردیم. پس از آن، کلاسی را به عنوان نقطه‌ای برای شروع برنامه تعریف کردیم و همچنین یک object را از روی کلاس WhatIsFinal ، در آن ساخته و متد تعریف‌ شده در این کلاس را بر روی این object ، فراخوانی کردیم. پس از آن نیز، کلاس دیگری را با نام Change تعریف کردیم تا این کلاس از کلاس WhatIsFinal ارث‌ بری کند. پس از آن، رفتار متد ()showData از کلاس WhatIsFinal را در این کلاس، Override کردیم.
پس از آن می توانیم تاثیری را که کلید واژه final بر روی روند اجرای برنامه می‌گذارد، تست کنیم. همانطور که در ابتدای مقاله نیز ذکر کردیم، می توانید از کلید واژه final برای تعریف کلاس‌ها و متدها و همینطور برای تعریف متغیرها استفاده کرد. استفاده از کلید واژه final در تعریف متغیرها، باعث می‌شود تا این متغیرها، دارای مقادیر ثابتی باشند و نمیتوانیم مقادیر جدیدی را به آنها بدهیم. علاوه بر این موضوع، استفاده از final در نامگذاری متدها نیز، باعث می شود که امکان Override کردن متد از دست برود.

و در آخر

وبسایت میربزرگی قصد دارد تا با ارائه مقاله ها و تجربه‌های کاربردی شما را در زمینه یادگیری و رفع اشکالاتتان کمک کند. در صورت وجود هرگونه سوالی به من ایمیل بزنید.

ارسال دیدگاه

Captcha + 48 = 58

در صورت نیاز و یا هر گونه مشکل ایمیل بزنید

پیام با موفقیت ثبت شد.
خطایی رخ داده است.