تستخدم هذه المقالة أمثلة لتحليل الفرق بين التحميل الزائد وإعادة الكتابة في Java بالتفصيل، ويمكن للأصدقاء المهتمين الرجوع إليه.
1. الحمولة الزائدة:
(1) التحميل الزائد للطريقة هو وسيلة للفئة للتعامل مع أنواع مختلفة من البيانات بطريقة موحدة. توجد وظائف متعددة بنفس الاسم في نفس الوقت، مع عدد/نوع مختلف من المعلمات.
التحميل الزائد هو مظهر من مظاهر تعدد الأشكال في الفصل.
(2) التحميل الزائد لأسلوب Java يعني أنه يمكن إنشاء طرق متعددة في الفصل، ولها نفس الاسم ولكن بمعلمات مختلفة وتعريفات مختلفة.
عند استدعاء الأساليب، عليك أن تقرر الطريقة التي ستستخدمها بناءً على عدد ونوع المعلمات التي تم تمريرها إليها. وهذا هو تعدد الأشكال.
(3) عند التحميل الزائد، يجب أن تكون أسماء الطرق هي نفسها، ولكن أنواع المعلمات وأرقامها مختلفة، ويمكن أن تكون أنواع قيمة الإرجاع هي نفسها أو مختلفة. لا يمكن استخدام نوع الإرجاع كمعيار للتمييز بين الوظائف المحملة بشكل زائد.
فيما يلي مثال على التحميل الزائد:
package c04.answer;// هذا هو اسم الحزمة// هذه هي طريقة البرمجة الأولى لهذا البرنامج. قم أولاً بإنشاء مثيل لفئة Dog في الطريقة الرئيسية، ثم استخدم الكلمة الأساسية هذه في مُنشئ فئة Dog للاتصال بها طريقة النباح مختلفة. يتم تمييز طرق التحميل الزائد المختلفة وفقًا لأنواع المعلمات الخاصة بها. // ملاحظة: يحظر المترجم استدعاء المُنشئ في أي مكان آخر باستثناء المُنشئ. package c04.answer;public class Dog {Dog(){this.bark();}void bark()//bark() الطريقة هي طريقة مثقلة {System.out.println(/"no barking!/"); this.bark(/"female/", 3.4);}void bark(String m,double l)//ملاحظة: قيم الإرجاع للطرق المحملة بشكل زائد هي نفسها، {System.out.println(/"a Barking Dog!/");this.bark(5, /"China/");} void bark(int a,String n)// لا يمكن تمييز الأساليب المحملة بشكل زائد عن طريق القيمة المرجعة، ولكن يمكن تمييزها فقط من خلال "نوع المعلمة" و"اسم الفئة" {System.out.println(/"كلب عواء/") }الفراغ الثابت العام (String[] args){كلب كلب = new Dog();//dog.bark(); [صفحة]//dog.bark(/"ذكر/"، /"yellow/");//dog.bark(5, / "الصين/")؛
2. التجاوز
(1) تعدد الأشكال بين الفئة الأصلية والفئة الفرعية، مما يعيد تعريف وظائف الفئة الأصلية. إذا كانت الطريقة المحددة في فئة فرعية لها نفس الاسم والمعلمات مثل الفئة الأصلية، فإننا نقول أن الطريقة متجاوزة. في، يمكن للفئات الفرعية أن ترث أساليب من الفئة الأصلية دون الحاجة إلى إعادة كتابة نفس الأساليب.
لكن في بعض الأحيان لا ترغب الفئة الفرعية في وراثة أساليب الفئة الأصلية دون تغيير، ولكنها ترغب في إجراء تعديلات معينة، الأمر الذي يتطلب إعادة كتابة الطريقة.
يُطلق على تجاوز الطريقة أيضًا اسم الكتابة فوق الطريقة.
(2) إذا كانت إحدى الطرق الموجودة في الفئة الفرعية لها نفس اسم الطريقة ونوع الإرجاع وقائمة المعلمات كطريقة في الفئة الأصلية، فستحل الطريقة الجديدة محل الطريقة الأصلية.
إذا كنت بحاجة إلى الطريقة الأصلية في الفصل الأصلي، فيمكنك استخدام الكلمة الأساسية الفائقة، والتي تشير إلى الفئة الأصلية للفئة الحالية.
(3) لا يمكن أن تكون أذونات تعديل الوصول لوظائف الفئة الفرعية أقل من تلك الخاصة بالفئة الأصلية؛
فيما يلي مثال على إعادة الكتابة:
المفهوم: آلية استدعاء أساليب الكائنات.
القائمة المنسدلة حول الربط الديناميكي:
1. يتحقق المترجم من النوع واسم الطريقة المعلن عنها بواسطة الكائن للحصول على كافة الأساليب المرشحة. حاول التعليق على اختبار الفئة الأساسية في المثال أعلاه، ومن ثم لن ينجح التجميع.
2. قرار التحميل الزائد: يتحقق المترجم من نوع المعلمة لاستدعاء الطريقة ويختار الطريقة الوحيدة من الطرق المرشحة أعلاه (سيكون هناك تحويل ضمني للنوع أثناء هذه العملية).
إذا وجد المترجم أكثر من واحد أو لا شيء، فسيقوم المترجم بالإبلاغ عن خطأ. حاول التعليق على اختبار (البايت ب) للفئة الأساسية في المثال أعلاه، وتكون نتيجة التشغيل هي 1 1.
3. إذا كان نوع الطريقة خاصًا ونهائيًا ثابتًا وكانت Java تستخدم التحويل البرمجي الثابت، فسيعرف المترجم بالضبط الطريقة التي سيتم استدعاؤها.
4. عند تشغيل البرنامج واستخدام الارتباط الديناميكي لاستدعاء طريقة ما، يجب على الجهاز الظاهري استدعاء إصدار الطريقة الذي يطابق النوع الفعلي للكائن.
في المثال، النوع الفعلي الذي يشير إليه b هو TestOverriding، لذلك يستدعي b.test(0) اختبار الفئة الفرعية.
ومع ذلك، فإن الفئة الفرعية لا تتجاوز test(byte b)، لذلك يستدعي b.test((byte)0) test(byte b) للفئة الأصلية.
إذا تم التعليق على (البايت b) للفئة الأصلية، فسيتم تحويل النوع الضمني إلى int في الخطوة الثانية، ويتم استدعاء الاختبار (int i) للفئة الفرعية أخيرًا.
3. ملخص التعلم:
تعدد الأشكال هو سمة من سمات البرمجة كائنية التوجه ولا علاقة له بالطرق.
بكل بساطة، يمكن لنفس الطريقة إجراء معالجة مختلفة وفقًا لبيانات الإدخال المختلفة، أي التحميل الزائد للطريقة - مع قوائم معلمات مختلفة (تعدد الأشكال الثابت)
عندما ترث فئة فرعية نفس الطريقة من الفئة الأصلية وتستخدم نفس بيانات الإدخال، ولكنها تريد الاستجابة بشكل مختلف عن الفئة الأصلية، يجب عليك تجاوز طريقة الفئة الأصلية.
أي إعادة كتابة هذه الطريقة في فئة فرعية - نفس المعلمات، وتطبيقات مختلفة (تعدد الأشكال الديناميكي)
الخصائص الثلاث الرئيسية لـ OOP: الوراثة، وتعدد الأشكال، والتغليف.
قاعدة الطبقة العامة {اختبار الفراغ (int i) {System.out.print (i)؛} اختبار الفراغ (بايت ب) {System.out.print (b)؛}} الطبقة العامة TestOverriding يمتد Base {اختبار الفراغ (int i ){i++;System.out.println(i);}public static void main(String[]agrs){Base b=new TestOverriding();b.test(0)b.test((byte)0)}}
نتيجة الإخراج في هذا الوقت هي 1 0، وهي نتيجة الارتباط الديناميكي في وقت التشغيل.
الميزة الرئيسية للتجاوز هي القدرة على تحديد الخصائص الخاصة بفئة فرعية:
publicclassFather{publicvoidspeak(){System.out.println(Father);}} publicclassSonextendsFather{publicvoidspeak(){System.out.println("son");}}
يُطلق على هذا أيضًا اسم تعدد الأشكال. لا يمكن أن توجد أساليب التجاوز إلا في علاقات الميراث.
عندما تكون طريقة الكلام () لفئة الأب خاصة في المثال أعلاه، لا يمكن لفئة الابن تجاوز طريقة التحدث () لفئة الأب في هذا الوقت، فإن طريقة التحدث () لفئة الأب تعادل طريقة التحدث () المحددة في فئة الابن.
بمجرد أن تصبح طريقة الكلام () للفئة الأب نهائية، بغض النظر عما إذا كانت الطريقة قد تم تعديلها بواسطة عام أو محمية أو افتراضية، فلن تتمكن فئة الابن من تجاوز طريقة التحدث () للفئة الأب على الإطلاق.
عند محاولة ترجمة التعليمات البرمجية، سوف يلقي المترجم خطأ. مثال:
publicclassFather{finalpublicvoidspeak(){System.out.println("Father");}}publicclassSonextendsFather{publicvoidspeak(){System.out.println("son");}}// سيبلغ المترجم عن خطأ؛
عندما يتم تعديل طريقة الكلام للفئة الأب () بشكل افتراضي، لا يمكن تجاوزها إلا من خلال الفئات الفرعية الموجودة في نفس الحزمة. إذا لم تكن في نفس الحزمة، فلا يمكن تجاوزها.
عندما يتم إنشاء نموذج أولي لأسلوب الكلام () للفئة الأب، لا يتم تجاوزها فقط من خلال فئاتها الفرعية في نفس الحزمة، ولكن يمكن أيضًا تجاوزها بواسطة فئات فرعية من حزم مختلفة.
قواعد تجاوز الأساليب:
1. يجب أن تكون قائمة المعلمات مطابقة تمامًا للطريقة التي تم تجاوزها، وإلا فلا يمكن تسميتها بإعادة الكتابة بل بالتحميل الزائد.
2. يجب أن يكون نوع الإرجاع دائمًا هو نفس نوع الإرجاع للطريقة التي تم تجاوزها، وإلا فلا يمكن تسميته بالكتابة الفوقية بل بالتحميل الزائد.
3. يجب أن يكون حد معدّل الوصول أكبر من معدّل الوصول للطريقة التي تم تجاوزها (عام>محمي>افتراضي>خاص)
4. يجب ألا تطرح الطريقة التي تم تجاوزها استثناءً محددًا جديدًا أو استثناءً محددًا أوسع من إعلان الطريقة التي تم تجاوزها. على سبيل المثال:
تعلن إحدى طرق الفئة الأصلية عن استثناء محدد IOException. عند تجاوز هذه الطريقة، لا يمكنك طرح استثناء. يمكنك فقط طرح استثناءات للفئات الفرعية من IOException، ويمكنك طرح استثناءات غير محددة.
والقواعد الزائدة:
1. يجب أن يكون لديك قوائم معلمات مختلفة؛
2. يمكن أن يكون لديك نوع إرجاع غير ملوم، طالما أن قائمة المعلمات مختلفة؛
3. يمكن أن يكون هناك معدّلات وصول مختلفة؛
4. يمكن طرح استثناءات مختلفة؛
الفرق بين إعادة الكتابة والتحميل الزائد هو:
يعمل تجاوز تعدد الأشكال على تقليل كمية إدخال التعليمات البرمجية بشكل كبير عند استدعاء الأساليب المحملة بشكل زائد. يمكن أن يكون لاسم الطريقة نفسه وظائف مختلفة أو يُرجع قيمًا طالما تم تمرير معلمات مختلفة إليه.
من خلال الاستفادة الجيدة من إعادة الكتابة والتحميل الزائد، يمكنك تصميم فئة ذات بنية واضحة وموجزة، ويمكن القول أن إعادة الكتابة والتحميل الزائد يلعبان دورًا غير عادي في عملية كتابة التعليمات البرمجية.