آشنایی با کلیدواژۀ final و کاربردهای آن در زبان برنامه‌نویسی جاوا


در این آموزش قصد داریم تا کلیدواژۀ 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 پرداخته و کاربرد آن در تعریف متغیرها و متدها را مورد بررسی قرار دادیم و گفتیم که استفاده از این کیورد در تعریف متغیرها موجب می‌شود تا مقادیری ثابت داشته و نتوان در سایر نقاط برنامه آن‌ها را مجدداً مقداردهی کرد. به علاوه، استفاده از این کیورد پیش از نام متدها نیز منجر بدین می‌گردد تا امکان اُورراید کردن متد مذکور را نداشته باشیم.

دانلود فایل‌های تمرین

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
Nirvana
Nirvana
۱۳۹۸/۰۵/۱۵
آقای مرادی در این قسمت از آموزشتون متأسفانه یک اشتباه غیر قابل چشم پوشی مرتکب شده‌اید. در توضیح کیورد final و کاربرد آن در هنگام تعریف کلاس, متد و متغیر, گفته اید که " - جهت تعریف کلاس: استفاده از این کلیدواژه برای کلاس‌ها منجر بدین می‌گردد تا کلاس مورد نظر قابلیت ارث‌بری از هیچ کلاسی را نداشته باشد..." در حالیکه اینگونه نیست و برعکس این قضیه صادق است. یعنی این که استفاده از کلیدواژه final برای کلاس منجر بدین می‌شود که هیچ کلاسی نتواند از آن کلاس ارث‌بری کند, نه این که آن کلاس (کلاس final) از هیچ کلاسی ارث‌بری نکند. مثلا کلاس A را به صورت final تعریف کرده‌ایم که منجر بدین می‌گردد که کلاس B نتواند از آن ارث‌بری کند, ولی طبق گفته شما, تعریف کردن کلاس A به صورت final منجر بدین می‌شود که این کلاس نتواند از کلاس B ارث‌بری کند در حالیکه این اشتباه است.
رسول ذاکری
رسول ذاکری
۱۳۹۷/۰۸/۲۶
تا به اینجای آموزش قسمت به قسمت جلو آمدم و هر بار نحوه آموزش و بیان شما را تحسین کردم، این طرز بیان و شیوه انتقال مطلب در بین تمام آموزش دهندگان مشابه فارسی زبان و حتی خارجی به‌ندرت یافت می شود و نشان از میزان مهارت و دانش شما در امر برنامه نویسی دارد، ضمن تبریک به شما آرزوی موفقیت روز افزون برایتان دارم.
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
۱۳۹۶/۱۲/۲۶
سلام
ببخشید فرقprivateوfinallدر چیه؟
اگر ماهر دورو استفاده کنیم امکان دسترسی بقیه کلاس ها از اون متوقف میشه
ممنون
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
۱۳۹۶/۱۱/۰۶
سلام😃
میشه گفت final در جاوا، همون const در C یا define در php هستش؟
ممنون
کاربر میهمان
ایمانمن یک کاربر مهمان هستم
۱۳۹۴/۰۹/۰۸
سلام
ممنون از آموزش عالیتون امیدوارم که همیشه موفق باشید
فقط یه مشکل کوچیک تو بده کدهاییک هنوشتین هست و اونم اینه که به جای "n" نوشته شده "n" لطفا تصحیح کنید.