مقدمة
في Java ، يجب تهيئة كائن بشكل صحيح قبل استخدامه ، والتي يتم تنصاؤها بواسطة مواصفات Java. لقد اكتشفت مؤخرًا سؤالًا مثيرًا للاهتمام ، وأصيبت الإجابة على هذا السؤال عيني للوهلة الأولى. ألق نظرة على هذه الفئات الثلاث:
package com.ds.test ؛ الفئة العامة العلوية {string uppersstring ؛ العلوي العام () {initializer.initialize (هذا) ؛ }} package com.ds.test ؛ فئة عامة أقل يمتد العلوي {string lowerstring = null ؛ العام السفلي () {super () ؛ System.out.println ("العلوي:" + uppersstring) ؛ System.out.println ("Lower:" + lowerstring) ؛ } public static void main (final string [] args) {new lower () ؛ }} package com.ds.test ؛ public class publicizer {static void تهيئة (anupper النهائي) {if (anupper extleof lower) {lower lower = (lower) anupper ؛ lower.lowerstring = "lowerinited" ؛ } anupper.upperString = "UpperInited" ؛ }} ما هو الإخراج الذي يمكن الحصول عليه عن طريق تشغيل الفئة Lower ؟ في هذا المثال الدنيا ، يمكن رؤية الموقف برمته بسهولة أكبر ، ولكن هذا الموقف يحدث في الواقع وسيكون هناك الكثير من الكود الذي يصرف انتباه الشخص.
على أي حال ، فإن الإخراج مثل هذا:
العلوي: UpperInitedLower: NULL ؛
على الرغم من استخدام نوع String في المثال الصغير ، فإن الكود الفعلي لفئة Initializer يحتوي على كائن مندوب للتسجيل ، وهو نفس وظيفة الفئة Lower - على الأقل الفئة Lower هي النية. ولكن لسبب ما لا يعمل عند تشغيل التطبيق. بدلاً من ذلك ، يتم استخدام المسار الافتراضي ولا يتم تعيين كائن المفوض (NULL).
الآن قم بتغيير رمز Lower قليلاً:
Package com.ds.test ؛ فئة عامة أقل يمتد العلوي {string lowerstring ؛ العام السفلي () {super () ؛ System.out.println ("العلوي:" + uppersstring) ؛ System.out.println ("Lower:" + lowerstring) ؛ } public static void main (final string [] args) {new lower () ؛ }}يبدو الإخراج الآن هكذا:
العلوي: UpperInitedLower: LowerInited
هل وجدت الفرق في الكود؟
نعم ، لم يعد هذا الحقل lowerString بشكل صريح لتفريغه. لماذا هذا يجعلها مختلفة؟ على أي حال ، أليس القيمة الافتراضية لحقل نوع المرجع (مثل String هنا) فارغة؟ بالطبع هو فارغ. اتضح أنه على الرغم من أن هذا التغيير الطفيف من الواضح أنه لا يغير سلوك الكود بأي شكل من الأشكال ، فإنه يجعل النتيجة مختلفة.
إذن ، ماذا حدث بالضبط؟ يصبح كل شيء واضحًا عند التحقق من ترتيب التهيئة:
1. الدالة main() تستدعي المنشئ Lower .
2. مثيل Lower جاهز. وهذا يعني أن جميع الحقول يتم إنشاؤها وملءها بالقيم الافتراضية ، على سبيل المثال ، القيمة الافتراضية لنوع المرجع فارغ والقيمة الافتراضية لنوع منطقية false . في هذا الوقت ، لا يحدث أي مهمة مضمنة إلى الحقل.
3. يسمى مُنشئ الفئة الأصل. يتم فرض هذا من خلال خصائص اللغة. لذلك قبل حدوث أي شيء آخر ، يتم استدعاء مُنشئ Upper.
4.upper يعمل هذا المُنشئ ويحدد إشارة إلى المثيل الذي تم إنشاؤه حديثًا لطريقة Initializer.initialize() .
5. تعلق فئة Initializer سلسلة جديدة لحقلان ( upperString و lowerString ). إن تعيين القيم إلى هذين الحقلين باستخدام instanceof قذر قليلاً لفحص المثيل ليس نمط تصميم جيد بشكل خاص ، ولكنه يعمل أيضًا ، لا تقلق بشأن ذلك كثيرًا. بمجرد حدوث ذلك ، لم تعد الإشارات إلى upperString و lowerString فارغة.
6. تم الانتهاء من دعوة إلى Upper Initializer.initialize()
7. الآن أصبح الأمر مثيرًا للاهتمام: يستمر بناء المثال Lower . على افتراض أنه لم يتم تحديد المهمة =null بشكل صريح في إعلان حقل lowerString ، يستأنف المنشئ Lower تنفيذ وتطبع سلسلتين متصلتين بالحقل.
ومع ذلك ، إذا كانت هناك عملية تُعين بشكل صريح ، فستكون عملية التنفيذ مختلفة قليلاً: عند اكتمال مُنشئ الفئة الأصل ، سيتم تنفيذ أي تهيئة متغيرة قبل تشغيل بقية المنشئين (انظر القسم 12.5 من مواصفات لغة Java). في هذه الحالة ، لم يتم تعيين مرجع السلسلة المعين إلى lowerString سابقًا مرة أخرى. ثم استمر في تنفيذ بناء الوظائف المتبقية ، والآن قم بطباعة قيمة lowerString على النحو التالي: NULL.
هذا مثال رائع ، ليس فقط لتسهيل انتباهنا إلى بعض التفاصيل حول إنشاء كائنات (أو لمعرفة مكان التحقق من مواصفات ترميز Java ، المطبوعة أو عبر الإنترنت) ، ولكن أيضًا لإظهار سبب كتابة مثل هذه التهيئة. يجب ألا نهتم بالفئة الفرعية لأعلى على الإطلاق. على العكس ، إذا كان لا يمكن إجراء تهيئة بعض الحقول في الفئة الفرعية لسبب ما ، فسيتطلب ذلك فقط بعض البديل من فئة مساعد التهيئة الخاصة به. في هذه الحالة ، إذا كنت تستخدم String lowString أو String lowerString = null يوجد فرق حقًا ، وما يجب أن يكون.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون محتوى هذه المقالة من بعض المساعدة في دراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل.