تصف هذه المقالة ميراث البرمجة الموجهة للكائن Java. شاركه للرجوع إليه ، على النحو التالي:
الميراث: فئة خاصة لها جميع خصائص وسلوكيات الطبقة العامة.
فوائد الميراث:
1. تحسين قابلية إعادة استخدام الكود
2. دع الفصل يكون له علاقة مع الفصل من قبل ، وفقط مع هذه العلاقة يمكن أن تكون هناك خصائص متعددة الأشكال. الميراث هو العلاقة بين الفصل والفئة قبل ذلك.
ملحوظات:
1. Java يدعم فقط الميراث الفردي ، وليس الميراث المتعدد. نظرًا لأن الوراثة المتعددة لها مخاطر أمان: عندما تحدد فئات الوالدين المتعددة نفس الوظيفة ، ولكن الوظائف مختلفة ، فإن الفئة الفرعية لا تعرف أي منها يجب تشغيله.
2. عندما ترث فئة الطفل فئة الأصل ، فإنها ترث جميع الأساليب وخصائص الفئة الأصل ويمكن استخدامها مباشرة.
3. جافا تدعم الميراث متعدد الطبقات ، أي العلاقة بين والد الحفيد
القواعد:
[Modifier] فئة الفئة الفرعية الفئة يمتد اسم الفئة الأصل {statle ؛}على سبيل المثال:
فئة pserson {int Age ؛ اسم السلسلة public void Speak () {system.out.println ("Hello World!") ؛ }} // ترث فئة الشخص ، ورث جميع الأساليب وسمات الطالب الفئة الأصل يمتد pserson {public void study () {system.out.println ("دراسة جيدة!") ؛ }} // ترث فئة الشخص ، وراثي جميع الأساليب وسمات عامل الفئة الأصل يمتد pserson {public void work () {system.out.println ("Wood Work!") ؛ }}كيفية استخدام الوظائف في نظام الميراث (انظر وثائق API):
تحقق من وظائف الفئة الأصل وإنشاء كائنات فئة فرعية لاستخدام الوظائف
غالبًا ما تتم مواجهة هذه السيناريوهات الثلاثة أثناء عملية الميراث:
1) متغير مع نفس الاسم
1. إذا كان لدى الفئة الفرعية متغير عضو غير خاص يحمل نفس الاسم ، فإن الفئة الفرعية تصل إلى متغير هذه الفئة ، وتستخدم هذا ؛ تصل الفئة الفرعية إلى المتغير الذي يحمل نفس الاسم في الفئة الأصل ، ويستخدم Super.
2. هذا يمثل إشارة إلى كائن هذه الفئة
3. يمثل Super إشارة إلى كائن الفئة الأصل (الاستخدام هو نفسه)
2) وظائف مع نفس الاسم
1. إذا ظهرت الفئة الفرعية وظيفة تمامًا مثل فئة الأصل (اسم الوظيفة والمعلمات هي نفسها) ، عندما يستدعي كائن الفئة الفرعية الوظيفة ، سيتم تشغيل محتوى وظيفة الفئة الفرعية. ، سيتم كتابة وظائف الفئة الأصل (تسمى أيضًا إعادة الكتابة).
2. أعد كتابة التعريف: عندما ترث الفئة الفرعية الفئة الأصل ، تتبع وظائف الفئة الأصل ، وتدخل الفئة الفرعية. ومع ذلك ، على الرغم من أن الفئة الفرعية لديها هذه الوظيفة ، فإن محتوى الوظيفة لا يتوافق مع الفئة الأصل. في هذا الوقت ، ليست هناك حاجة لتحديد وظيفة جديدة ، ولكن استخدم ميزة Override ، والاحتفاظ بتعريف وظيفة الفئة الأصل ، وإعادة كتابة محتوى الوظيفة.
3. ملاحظات حول إعادة الكتابة (الكتابة فوق):
<1> الفئات الفرعية تخطى فئة الوالدين. يجب عليك التأكد من أن أذونات فئة الطفل أكبر من أو تساوي أذونات فئة الأصل قبل الميراث ، وإلا فإن التجميع سيفشل. (عام> لا تكتب الكلمات الرئيسية الخطابية> القطاع الخاص)
يمكن أن يغطي <2> ثابت فقط ثابتًا
<3> التحميل الزائد: انظر فقط إلى قائمة المعلمات للوظيفة بنفس الاسم وإعادة الكتابة: يجب أن تكون طريقة فئة الوالدين الطفل هي نفسها تمامًا (اسم الوظيفة وقائمة المعلمة)
Class fu {// public void show () عندما تكون الفئة الأصل show () ، فسيكون ذلك تمامًا مثل وظيفة الفئة الفرعية. سيتم إعادة كتابة وظيفة العرض للفئة الأصل عن عرض الفراغ العام (اسم السلسلة). }} class zi يمتد fu {public void show () {system.out.println ("zi") ؛ }} class jicheng {public static void main (string [] args) {zi z1 = new zi () ؛ z1.show ("nihao") ؛ // سيتم استدعاء وظيفة العرض للفئة الأصل}}3) مُنشئ
1. عند تهيئة كائن الفئة الفرعية ، سيتم تشغيل مُنشئ الفئة الأصل أيضًا ، لأن السطر الأول من مُنشئ الفئة الفرعية له عبارة ضمنية Super () بشكل افتراضي.
2. Super () سيصل إلى مُنشئ المعلمات المجوفة في الفئة الأصل ، والخط الأول لجميع المنشئين في الفئة الفرعية هو Super () افتراضيًا
3. السبب الذي يجعل الفئات الفرعية الوصول إلى مُنشئ الفئة الأصل
<1> لأنه يمكن الحصول على الفئة الفرعية للبيانات في الفئة الأصل مباشرةً ، فإن الفئة الفرعية هي أن ترى أولاً كيف تهيئة الفصل عن البيانات. لذلك ، عند تهيئة الفئة الفرعية ، تصل أولاً إلى مُنشئ الفئة الأصل بشكل افتراضي.
<2> إذا كنت ترغب في الوصول إلى المُنشئ الذي صاغه الفئة الأصل أو المنشئ الذي لا تحتوي فئة الأم التي لا تحتوي على معلمات فارغة ، فيمكنك صياغتها من خلال تحديد البيان الفائق يدويًا.
<3> بالطبع ، يمكن أيضًا تحديد السطر الأول من مُنشئ الفئة الفرعية يدويًا للوصول إلى مُنشئ هذه الفئة ، ولكن على الأقل واحد من المُنشئين في الفئة الفرعية سيصل إلى مُنشئ الفئة الأم.
فئة fu {string name ؛ عمري fu () {system.out.println ("hello fu") ؛} fu (اسم السلسلة) {system.out.println (name) ؛ } fu (اسم السلسلة ، int age) {this.name = name ؛ this.age = العمر ؛ System.out.println ("الاسم:"+name+"، العمر:"+العمر) ؛ }} class zi يمتد fu {//zi() {system.out.println("hello zi ") ؛} بشكل افتراضي ، سيتم استدعاء مُنشئ Zi () بدون المعلمة. Super ("Zhangsan" ، 20) ؛ // استخدم البيان الفائق يدويًا لتحديد مُنشئ الفئة الأصل للحصول على معلومات غير خاصة لنظام الفئة الأصل. }} اختبار الفئة {public static void main (string [] args) {zi z1 = new zi () ؛ }}مثال على استثناء المنشئ:
اكتب نتائج البرنامج
فئة Super {int i = 0 ؛ Public Super (سلسلة S) {i = 1 ؛ }} Class Demo يمتد Super {Public Demo (String S) {i = 2 ؛ } public static void main (string [] args) {demo d = new demo ("yes") ؛ system.out.println (di) ؛ }} // فشل التجميع لأن المنشئ ذو المعلمات الفارغة كان مفقودًا في الفئة الأصل. // أو يجب أن تحدد الفئة الفرعية المنشئ في الفئة الأصل ليتم استدعاؤه من خلال العبارة الفائقة.إعادة كتابة الأمثلة على الحمل الزائد:
Class Demo {int show (int a ، int b) {return 0 ؛}}يمكن أن توجد الوظائف التالية في فئة فرعية من العرض التجريبي.
A.Public int Show (int a ، int b) {return 0 ؛} // yes ، الكتابة فوق.
ب.
C.Private int show (int a ، long b) {return 0 ؛} // yes ، إنها ليست نفس وظيفة الفئة الأصل. لا تغطية تعادل التحميل الزائد.
D.Public Short Show (int a ، int b) {return 0 ؛} // no ، لأن هذه الوظيفة لا يمكن أن تظهر في نفس الفئة مثل الوظيفة المحددة ، أو في فئة الوالدين الطفل.
E.Static int show (int a ، int b) {return 0 ؛} // no ، يمكن أن يكون ثابتًا فقط الكتابة فوق ثابت. <br> <br> بحيث تسمح الفئة الفرعية بإعادة الكتابة والتحميل الزائد.
لمزيد من المحتوى المتعلق بـ Java ، يمكن للقراء المهتمين بهذا الموقع عرض الموضوعات: "مقدمة والبرمجة التعليمية المتقدمة حول البرمجة الموجهة إلى Java" ، و "البرنامج التعليمي حول بنية بيانات Java" و "خوارزمية" و "ملخص مهارات تشغيل Java" ، و "ملخص مهارات تشغيل Java" و "ملخصات Java Cate".
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.