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

آشنایی با کلیدواژۀ 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 در تعریف متدها

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