يتم استخدام الكلمة الأساسية JAVA Final لتعديل البيانات أو الأساليب أو الفئات، والتي تعني عادةً "غير قابلة للتغيير"، أي أنه لا يمكن تغيير البيانات، ولا يمكن تجاوز الأساليب، ولا يمكن وراثة الفئات. هناك بشكل عام سببان لاستخدام النهائي: التصميم والكفاءة. مع تحديث إصدار JAVA، يمكن معالجة بعض مشكلات الكفاءة بواسطة المترجم وJVM. لذلك، فإن استخدام النهائي لحل مشاكل الكفاءة ليس مهمًا جدًا.
يتم استخدام المعدل النهائي في الغالب في مجالات أنواع البيانات البدائية أو الفئات غير القابلة للتغيير (إذا لم تغير جميع الأساليب في الفئة كائنها، فهذه الفئة هي فئة غير قابلة للتغيير. السلسلة هي فئة غير قابلة للتغيير).
[البيانات النهائية]
هناك حالتان رئيسيتان يتم فيهما استخدام الكلمة الأساسية النهائية لتعديل البيانات:
1. ترجمة ثوابت الوقت
2. القيم التي تتم تهيئتها في وقت التشغيل
بالنسبة لثوابت وقت الترجمة، يشير هذا إلى حقل نهائي وثابت (وفقًا للاتفاقية، تتم تسمية ثوابت وقت الترجمة بأحرف كبيرة، ويتم فصل كل كلمة بشرطة سفلية). لا يمكن تغييرها. يمكن للمترجم استبدال ثوابت وقت الترجمة في أي صيغة حسابية قد تستخدمها، وهذا يعني أنه يمكن تنفيذ صيغة الحساب في وقت الترجمة، مما يقلل نسبيًا من عبء وقت التشغيل. يجب أن يكون لثابت وقت الترجمة قيمة مخصصة له عند تعريفه (وليس بالضرورة نوعًا أساسيًا).
بالنسبة للقيم التي تمت تهيئتها في وقت التشغيل، بالنسبة للأنواع الأساسية، فإن Final يجعل القيمة غير قابلة للتغيير؛ وبالنسبة لمراجع الكائنات، فإن Final يجعل المرجع غير قابل للتغيير، أي أنه لا يمكن تغييره للإشارة إلى كائن آخر، ومع ذلك، يمكن تعديل الكائن نفسه (. تنطبق على المصفوفات، والمصفوفات هي أيضًا كائنات).
سلسلة نهائية ثابتة خاصة TESTD = "اختبار"؛
السلسلة النهائية العامة الثابتة TESTE = "اختبار"؛
public static Final String[] TESTF = {"1"، "2"}؛ // نوع غير أساسي
سلسلة نهائية ثابتة خاصة[] TESTG = سلسلة جديدة[2];
الفراغ الثابت العام الرئيسي(String args[]){
اختبار int النهائي A = 1؛
اختبار السلسلة النهائيةB = "اختبار"؛
Final int[] testC = {1,1,2,};
System.out.println(testC[1]);
اختبارC[1] = 123;
System.out.println(testC[1]);
}
}
تسمح JAVA بإنشاء حقول نهائية غير مخصصة، ولكن يجب تعيين الحقل النهائي عند تعريف الحقل أو في كل مُنشئ (أي عدد من المُنشئين الموجودين) لضمان تهيئته قبل الاستخدام. بهذه الطريقة، يمكن استخدام Final بشكل أكثر مرونة، وفي نفس الفئة، يمكن تعيين قيم مختلفة لكائنات مختلفة مع الحفاظ على خصائص غير قابلة للتغيير.
جافا بلانكفينال العامة () {
فارغ = 2011؛
}
جافا بلانك فاينال العامة (int temp) {
فارغ = 2012؛
}
جافا بلانك فاينال العامة (سلسلة مؤقتة) {
فارغ = 2014؛
}
الفراغ الثابت العام الرئيسي(String args[]){
new javaBlankFinal();
}
}
هناك سببان لاستخدام الطريقة النهائية: الأول هو قفل الطريقة لمنع الكتابة فوق الطريقة والتأكد من بقاء سلوك الطريقة دون تغيير أثناء الوراثة، والآخر هو تحويل استدعاءات الطريقة إلى استدعاءات مضمنة لتقليل تكلفة الطريقة المكالمات. ومع ذلك، في الإصدارات الأخيرة، يمكن لـ JVM تحسين نفسه، لذلك ليست هناك حاجة لاستخدام الأساليب النهائية للتعامل مع مشكلات الكفاءة.
فيما يتعلق بالطريقة النهائية، هناك شيء آخر يجب ملاحظته، حيث تم تصنيف جميع الطرق الخاصة في الفصل ضمنيًا على أنها طرق نهائية (يمكنك أيضًا إضافة تعديل نهائي إليها، لكنه لا معنى له). عندما تحاول تجاوز طريقة خاصة، لا يقوم المترجم بالإبلاغ عن خطأ، ولكن في الواقع لا تقوم بالكتابة فوق الطريقة، بل تقوم فقط بإنشاء طريقة جديدة. نظرًا لأنه لا يمكن للفئات الخارجية الوصول إلى الطريقة الخاصة، فلا يمكن تجاوزها بالطبع.
يمكن أن يؤدي استخدام التعليق التوضيحيOverride إلى منع المشكلات المذكورة أعلاه. كما هو موضح في البرنامج :
الفراغ النهائي الخاص FinalFunctionB () {
System.out.println("finalFunctionB");
}
الفراغ النهائي FinalFunctionC () {
System.out.println("finalFunctionC");
}
وظيفة باطلةD () {}
}
يمتد تجاوز الفئة FinalFunction إلى FinalFunction {
//@Override أضف تعليقًا توضيحيًا @Override لتحديد ما إذا كان هذا تجاوزًا
الفراغ العام FinalFunctionA () {
System.out.println("تجاوز FinalFunctionA");
}
الفراغ النهائي العام FinalFunctionB () {
System.out.println("تجاوز FinalFunctionB");
}
// Final void FinalFunctionC(){} // لا يمكن تجاوز الطريقة النهائية من FinalFunction
@تجاوز
void functionD(){} // طريقة التجاوز الحقيقية
}
الطبقة العامة javaFinalFunction تمتد FinalFunction {
الفراغ الثابت العام الرئيسي(String args[]){
FinalFunction ff = new FinalFunction();
//ff.finalFunctionA(); //لا يمكن استدعاء الطريقة الخاصة
//ff.finalFunctionB();
overrideFinalFunction off = new overrideFinalFunction();
off.finalFunctionA(); // الطريقة العامة
off.finalFunctionB();
}
}
يتم استخدام الفئات النهائية بشكل عام لأسباب تصميمية، والتي لا تسمح بوراثة الفئة. وهذا يضمن عدم تغيير سلوك الفصل، وقد يؤدي أيضًا إلى تجنب بعض المخاطر الأمنية. يتم تعيين جميع الأساليب في الفئة النهائية ضمنيًا على أنها طرق نهائية وبالتالي لا يمكن تجاوزها (نظرًا لأن الفئة النهائية تحظر الوراثة، لا يمكن تجاوز الطرق الموجودة في فئتها). في Java API الأساسية، هناك العديد من الأمثلة للتطبيق النهائي، مثل java.lang.String. حدد Final لفئة String لمنع أساليب الكتابة مثل length().
بالنسبة للحقول النهائية، حتى إذا تم إعلان الفصل الدراسي نهائيًا، فلن تصبح الحقول الموجودة في الفصل الدراسي حقولًا نهائية تلقائيًا.
الطبقة العامة javaFinalClass {
الفراغ الثابت العام الرئيسي(String args[]){
FinalClass fc = new FinalClass();
System.out.println(fc.testA);
fc.testA = 2012؛
System.out.println(fc.testA);
}
}