المفاهيم الأساسية للميراث والتوليف
الميراث: يمكن إنشاء فئة جديدة بناءً على فئة موجودة. يمكن لورث الفصول الحالية إعادة استخدام الأساليب والمجالات لهذه الفئات. على هذا الأساس ، يمكن إضافة طرق ومجالات جديدة لتوسيع وظائف الفصل.
التوليف: يسمى إنشاء الكائن الأصلي في فئة جديدة. وبهذه الطريقة يمكنك إعادة استخدام التعليمات البرمجية الحالية دون تغيير شكلها.
1. بناء الجملة الموروثة
تشير الكلمة الرئيسية إلى أن الفئة الجديدة مشتقة من فئة موجودة. يُطلق على الفئة الموجودة فئة أولياء الأمور أو فئة أساسية ، ويسمى فئة جديدة فئة فرعية أو فئة مشتقة. على سبيل المثال:
طالب الفصل يمتد الشخص {}يرث طالب الفصل الشخص. يُطلق على فئة الشخص فئة أولياء الأمور أو الفصل الأساسي ، ويسمى فصل الطلاب فئة فرعية أو فئة مشتقة.
2. توليف التوليف
التوليف بسيط نسبيًا ، وهو إنشاء فئة موجودة في الفصل.
طالب الفصل {dog dog ؛}التصميم لأعلى
1. المفاهيم الأساسية
يكمن دور الميراث في إعادة استخدام الكود. نظرًا لأن الميراث يعني أنه يمكن أيضًا استخدام جميع طرق الفئة الأصل في الفئات الفرعية ، يمكن أيضًا إرسال الرسائل المرسلة إلى الفئة الأصل إلى فئة المشتق. إذا كانت هناك طريقة EAT في فصل الشخص ، فستكون هناك هذه الطريقة في فصل الطالب ، مما يعني أن كائن الطالب هو أيضًا نوع من الأشخاص.
شخص فئة {public void eat () {system.out.println ("eat") ؛} show static void show (person p) {p.eat () ؛}} طالب الطبقة العامة يمتد الشخص {public static void main (string [] args)نتائج التشغيل】:
يأكل
يتم استخدام طريقة العرض المحددة شخصيًا لتلقي مقابض الشخص ، ولكن في ① تتلقى إشارة إلى كائن الطالب. هذا لأن كائن الطالب هو أيضًا كائن شخص. في طريقة العرض ، يمكن أن يكون المقبض (المرجع إلى الكائن) الذي تم تمريره كائن شخص وكائن فئة مشتق شخص. يصبح هذا السلوك في تحويل المقابض الطالب إلى مقابض شخص نمطًا تصاعديًا.
2. لماذا تحتاج إلى تتبع الشكل؟
لماذا تريد تجاهل نوع الكائن عمداً الذي يسميه عند الاتصال بتناول الطعام؟ إذا قمت بعمل طريقة العرض ، فما عليك سوى الحصول على مقبض الطالب ، يبدو الأمر أكثر سهولة وسهلة الفهم ، ولكن هذا سيجعل كل فصل جديد مستمد من فئة الشخص ينفذ طريقة العرض الخاصة به:
قيمة الفئة {private int count = 1 ؛ value (int count) {this.count = count ؛} القيمة النهائية الثابتة العامة v1 = القيمة الجديدة (1) ، v2 = القيمة الجديدة (2) ، v3 = v3 = new value (3) ؛ {system.out.println ("teacher.eat ()") ؛}} طالب الفصل يمتد الشخص {public void eat (value v) {system.out.println ("student.eat () {t.eat (value.v1) ؛} عرض باطل ثابت عام (الشخص p) {p.eat (value.v1) ؛} main public static static void (string [] args) {student s = new studtenهناك عيب واضح في هذا النهج هو أنه من الضروري تحديد الأساليب المتعلقة ارتباطًا وثيقًا بفئة مشتقة كل شخص ، مما يؤدي إلى الكثير من الكود المكررة. من ناحية أخرى ، إذا نسيت التحميل الزائد للطريقة ، فلن تقوم بالإبلاغ عن خطأ. يمكن دمج طرق العرض الثلاثة في المثال أعلاه إلى واحد:
عرض الفراغ الثابت العام (الشخص P) {p.eat (value.v1) ؛} الربط الديناميكي
عند أداء العرض (العرض) ، فإن نتيجة الإخراج هي student.eat (). هذه هي النتيجة المرجوة بالفعل ، لكن لا يبدو أنها قد تم تنفيذها في النموذج الذي كنا نأمله. لنلقي نظرة على طريقة العرض مرة أخرى:
عرض الفراغ الثابت العام (الشخص P) {p.eat (value.v1) ؛}يتلقى تعامل شخص. عند أداء العرض (العرض) ، كيف يعرف أن الشخص يتعامل مع كائن طالب بدلاً من كائن المعلم؟ ليس لدى المترجم أي وسيلة لمعرفة ذلك ، والتي تنطوي على قضية الربط المراد شرحها بعد ذلك.
1. طريقة ملزمة استدعاء الطريقة
يسمى توصيل طريقة ونفس الطريقة الجسم معًا الربط. إذا تم تنفيذ الربط قبل التشغيل ، يطلق عليه "الربط المبكر". في المثال أعلاه ، عندما يكون هناك تعامل شخص واحد فقط ، لا يعرف المترجم الطريقة التي يجب الاتصال بها. تنفذ Java آلية استدعاء طريقة يمكنها تحديد نوع كائن أثناء التشغيل ثم استدعاء الطريقة المقابلة. يسمى هذا الربط بناءً على نوع الكائن الربط الديناميكي أثناء العملية. ما لم يتم الإعلان عن الطريقة النهائية ، فإن جميع الطرق في Java ملزمة ديناميكيًا.
استخدم صورة لتمثيل علاقة الميراث للشكل التصاعدي:
في الكود ، يتم تلخيصه على النحو التالي:
Shapes=newShape();
وفقًا لعلاقة الميراث ، من القانوني تعيين مقبض كائن الدائرة الذي تم إنشاؤه إلى شكل ، لأن الدائرة تنتمي إلى شكل.
عندما تسمى إحدى طرق الطبقة الأساسية:
Shapes=newShape();
في هذا الوقت ، تسمى Circle.draw () ، ويرجع ذلك إلى الربط الديناميكي.
فئة الفئة {void eat () {} void Speak () {}} فئة الصبي يمتد الشخص {void eat () {system.out.println ("boy.eat ()") ؛ {system.out.println ("girl.eat ()") ؛}} فئة عامة الأشخاص {public static person Randperson () {switch ((int) (Math.Random () * 2)) {default: case 0: for new boy () ؛ case 1: repring new girl () ؛ i <p.length ؛ i ++) {p [i] = randperson () ؛بالنسبة لجميع الفصول المستمدة من الشخص ، يقوم الشخص بإنشاء واجهة عامة ، وجميع الفصول المشتقة لها سلوكان: تناول الطعام والتحدث. الفئة المشتقة تتجاوز هذه التعريفات ويعيد تعريف كلا السلوكيات. في الفصل الرئيسي ، يختار Randperson بشكل عشوائي مقبض كائن الشخص. ** يحدث نمط الاستئناف في بيان العودة. يأخذ بيان العودة ** صبيًا أو فتاة ويعيده كنوع من الشخص. في هذا الوقت ، لا أعرف نوعه ، وأنا أعلم فقط أنه يعامل كائن شخص. في الطريقة الرئيسية ، اتصل بطريقة Randperson لملء كائن الشخص إلى الصفيف ، ولكن لا تعرف الموقف المحدد. عندما يتم استدعاء طريقة EAT لكل عنصر من عناصر الصفيف ، فإن وظيفة الربط الديناميكي هي تنفيذ الطريقة المعاد تعريفها للكائن.
ومع ذلك ، فإن الربط الديناميكي هو شرط أساسي ، ويجب أن توجد طريقة الربط في الفئة الأساسية ، وإلا فلن يتم تجميعها وتمريرها.
الفئة person {void eat () {system.out.println ("person.eat ()") ؛}} فئة الصبي يمتد الشخص {void eat () {system.out.println ("boy.eat () {person p = new boy () ؛ p.eat () ؛ p.speak () ؛ // الطريقة غير محددة للنوع الشخص}}إذا لم يتم تحديد طريقة تجاوز في الفئة الفرعية ، فسيتم تسمى الطريقة في الفئة الأصل:
الفئة person {void eat () {system.out.println ("person.eat ()") ؛}} فئة الفئة يمتد الشخص {} الفئة العامة {public static void main (string [] args) {person p = new boy () ؛ p.eat () ؛}}نتائج التشغيل】:
person.eat ()
2. ربط الطرق الثابتة
أضف الكلمة الرئيسية الثابتة إلى الطرق المذكورة أعلاه وتحويلها إلى طرق ثابتة:
الفئة {static void eat () {system.out.println ("person.eat ()") ؛} static void Speak () {system.out.println ("person.speak (") ؛}} class extative person {static void eat () {system.out.println ( {system.out.println ("boy.speak ()") ؛}} الفتاة الفئة تمتد الشخص {static void eat () {system.out.println ("girl.eat () ((int) (Math.Random () * 2)) {افتراضي: الحالة 0: إرجاع New Boy () ؛ الحالة 1: إرجاع Girl New Girl () ؛}} main public static void main (string [] args) {person [] p = new شخص [4] ؛ من أجل (int i = 0 ؛ <p.length ؛ i ++) {p [i] .eat () ؛}} نتائج التشغيل】:
person.eat ()
person.eat ()
person.eat ()
person.eat ()
نتائج الملاحظة: بالنسبة للطرق الثابتة ، بغض النظر عن كائن الفئة الفرعية التي يشير إليها الفئة الأصل ، تسمى طريقة الفئة الأصل.
صيغة ذاكري
- طريقة ثابتة: تنظر طريقة ثابتة في الفئة الأصل
-الطرق غير القتالية: الطرق غير الستاطية تنظر إلى الفئات الفرعية
لخص
ما سبق هو كل محتوى التفسير المفصل لهذه المقالة لمفهوم ميراث جافا ، وآمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!