دور استخدام النهائي لتعديل المعلمات في جافا
إضافة الكلمة الرئيسية النهائية قبل معلمات الطريقة هي منع تعديل البيانات في وزن الطريقة.
هناك حالتان رئيسيتان: أولاً ، استخدم النهائي لتعديل نوع البيانات الأساسية ؛ ثانياً ، استخدم النهائي لتعديل نوع البيانات المرجعية.
في الحالة الأولى ، قم بتعديل نوع البيانات الأساسية ، في الوقت الذي لا يمكن تعديل قيمة المعلمة في هيئة الطريقة ، أي أنه لا يمكن إعادة تعيينه. خلاف ذلك ، لن يتم تمرير التجميع.
الحالة الثانية هي تعديل النوع المرجعي. في هذا الوقت ، لا يمكن تغيير الكائن المشار إليه بواسطة متغير المعلمة. ومع ذلك ، بالنسبة لأنواع البيانات المرجعية ، من الجيد تمامًا تعديل خصائصها.
لذلك ، إذا كنت ترغب في استخدام الكلمة الرئيسية النهائية ، فاستخدم نوع البيانات الأساسي ، وهو مفيد للغاية.
المتغير النهائي:
استخدم النهائي للأنواع الأساسية: إنها ثابتة ، والقيمة ثابتة وتبقى القيمة دون تغيير.
استخدم النهائي لمراجع الكائن: اجعل المرجع ثابتًا وبمجرد تهيئة المرجع للإشارة إلى كائن ما ، لا يمكن تغييره للإشارة إلى كائن آخر. ومع ذلك ، يمكن تعديل الكائن نفسه ، ولا يوفر Java طريقة لجعل أي كائن ثابتًا. يستخدم هذا القيد أيضًا المصفوفات ، وهي كائنات.
مثال:
قيمة الفئة {int i ؛ القيمة العامة (int i) {this.i = i ؛ }} الفئة العامة FinalData {private static عشوائي عشوائي = جديد عشوائي (47) ؛ معرف السلسلة الخاص ؛ public FinalData (string id) {this.id = id ؛ } private Final int valueone = 9 ؛ خاص ثابت int value_two = 99 ؛ الثابتة العامة int value_three = 39 ؛ Final Final INT I4 = Random.NextInt (20) ؛ ثابت نهائي int_5 = عشوائي. nextint (20) ؛ القيمة الخاصة v1 = قيمة جديدة (11) ؛ القيمة النهائية الخاصة v2 = قيمة جديدة (22) ؛ القيمة النهائية الثابتة الخاصة Val_3 = قيمة جديدة (33) ؛ نهائي خاص int [] a = {1 ، 2 ، 3 ، 4 ، 5 ، 6} ؛ السلسلة العامة toString () {return id + ":" + "i4 =" + i4 + "، int_5 =" + int_5 ؛ } public static void main (string [] args) {finalData fd1 = new FinalData ("fd1") ؛ //! fd1.valueOne ++ ؛ // لأن ValueOne ثابت نوع أساسي ، فإن قيمته ثابتة fd1.v2.i ++ ؛ // يمكن تغيير محتوى الكائن المعدل حسب النهائي fd1.v1 = قيمة جديدة (9) ؛ لـ (int i = 0 ؛ i <fd1.a.length ؛ i ++) fd1.a [i] ++ ؛ //! fd1.v2 = قيمة جديدة (0) ؛ // لأن V2 هو نوع مرجعي تم تعديله حسب النهائي ، لا يمكن تعديل مرجعه للإشارة إلى كائن آخر //! fd1.val_3 = قيمة جديدة (1) ؛ //يحتل مساحة ذاكرة لا يمكن تغييرها //! fd1.a = new int [3] ؛ // النهائي المعدل system.out.println (FD1) ؛ System.out.println ("إنشاء FinalData جديد") ؛ FinalData fd2 = new FinalData ("fd2") ؛ System.out.println (FD1) ؛ System.out.println (FD2) ؛ }}/*الإخراج: fd1: i4 = 15 ، int_5 = 18 إنشاء FinalDatafd1: i4 = 15 ، int_5 = 18fd2: i4 = 13 ، int_5 = 18*/تحليل:
بالنسبة إلى FD1 ، FD2 كائنين ، I4 فريد من نوعه ، أي أن كل كائن يحتوي على i4 ، ولكن يتم إعلان int_5 ثابتًا ، أي أنه يتم مشاركته بواسطة الفئة ، FD1 و FD2 Share Int_5 ، والتي يتم تهيئتها في وقت التحميل ، بدلاً من تهيئة كل مرة يتم فيها إنشاء كائن جديد (على سبيل المثال ، i4) ؛ ولكن تم ضبطه على النهائي في نفس الوقت ، لذلك لم يكن مرجعه غير قابل للتغيير ، أي أنه لا يمكن تعديله للإشارة إلى كائن آخر.
نهائي فارغ:
يُعلن أنه نهائي ولكن ليس له قيمة أولية. يجب تعيين النهائي باستخدام التعبيرات في تعريف المجال أو في كل مُنشئ ، وهذا هو السبب في تهيئة المجال النهائي دائمًا قبل الاستخدام.
المعلمات النهائية:
هذا يعني أنه لا يمكنك تغيير مرجع المعلمة في طريقة الإشارة إلى معلمة أخرى ، ولكن يمكنك تعديل ما يشير إليه الكائن النهائي
مثال:
فئة gizmo {int i = 0 ؛ public void Spin () {}} فئة public finalarguments {void with (final gizmo g) {//! g = جديد gizmo () ؛ // لم يتم تعديل المرجع الذي تم تعديله بواسطة النهائي للإشارة إلى كائن آخر G.I ++ ؛ // ولكن يمكن تعديل المحتوى الذي أشار إليه الكائن النهائي} بدون (gizmo g) {g = new gizmo () ؛ G.Spin () ؛ } // int g (final int i) {// //! i ++ ؛ // لأن المعلمة I هي قيمة ثابتة //} int g (final int i) {return i + 1 ؛ } public static void main (string [] args) {FinalArguments bf = new FinalArguments () ؛ Bf.with (NULL) ؛ Bf.with (NULL) ؛ }}تحليل:
تم إعلان المعلمة على أنها نهائية. إذا كانت معلمة أساسية ، فهي ثابتة ولا يمكن تعديلها ؛ إذا كان متغيرًا مرجعيًا ، فلا يمكن تعديله للإشارة إلى كائن آخر ، ولكن يمكن تعديل محتوى الكائن المشار إليه بواسطة المرجع.
طريقة خبير:
سبب الاستخدام:
يتم تحديد جميع الأساليب الخاصة في الفصل ضمنيًا على أنها نهائية ، وبما أنه لا يمكن استخدام الطريقة الخاصة ، فلا يمكن الكتابة عليها. يمكن إضافة المعدل النهائي إلى الطريقة الخاصة ، لكن هذا لا يعطي أي معنى إضافي للطريقة.
مثال:
فئة withfinals {private final void f () {system.out.println ("withFinals.f ()") ؛ } private void g () {system.out.println ("overridgePrivate.f ()") ؛ }} class overtridgeprivate يمتد مع {private final void f () {system.out.println ("overridgePrivate.f ()") ؛ }} class overridgePrivin2 يمتد OverridgePrivate { /** عند استخدام التعليق التوضيحي التجاوز لإجبار طريقة F () على الكتابة فوق طريقة F () للفئة الأصل ، سيتم الإبلاغ عن خطأ* لأنه لا يعرف ما إذا كانت الفئة الأصل لديها الطريقة. بالنسبة لطريقة G () ، فإنه يولد طريقة جديدة فقط ، و * لا يكتب طريقة G () في الفئة الأصل. *///@override public final void f () {system.out.println ("overridgePrivate2.f ()") ؛ } public void g () {system.out.println ("overridgePrivate2.g ()") ؛ }} الفئة العامة FinoverRidingRidingIllusion {public static void main (string [] args) {overridgePrivate2 op2 = new OverridgePrivate2 () ؛ op2.f () ؛ op2.g () ؛ // يمكنك تحويل OPTRIDINGPRINCING OP = OP2 ؛ //! op.f () ؛ // الطريقة النهائية في الفئة الأصل غير مرئية للفئة الفرعية //! op.g () ؛ withfinals wf = op2 ؛ // wf.f () ؛ // wf.g () ؛ {تحليل:
متى تحدث التغطية:
1. الطرق التي تظهر في الفئات الفرعية التي هي بالضبط نفس الطبقات الوالدية
2. يمكن تحويل الفئة الفرعية إلى فئة من الأم إلى الأعلى واتصل بالطريقة في الفئة الأصل
إذا تم الإعلان عن طريقة في الفئة الأصل على أنها نهائية أو خاصة ، فإن هذه الطريقة غير مرئية للفئة الفرعية. حتى إذا تم إنشاء طريقة تمامًا مثل الفئة الأصل في الفئة الفرعية ، فهذه طريقة جديدة ، بدلاً من طريقة تجاوزت طريقة من الفئة الأصل.
الفصل النهائي:
أي أن هذا الفئة لا يمكن أن يتم مورثها ، سواء أكانت أنت أو الآخرين ، أي أن هذه الفئة لا تتطلب أي تغييرات ، ولا تتطلب أي فئات فرعية ، مثل فئة السلسلة.
مثال:
الفئة الصغيرة {} الفئة النهائية dinosaur {int i = 7 ؛ int j = 1 ؛ smallbrain x = new SmallBrain () ؛ void f () {}} // error: لا يمكن للنوع أيضًا أن يفصل فئة الديناصورات الفئة النهائية // فئة الديناصورات الفرعية // الفئة التي تمتد بشكل إضافي dinosaur {} الفئة العامة jurassic {public static void main (string [] args) {dinosaur n = new dinosaur () ؛ nf () ؛ ني = 40 ؛ N.J ++ ؛ }}لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.