Java Inner Class ، تم العثور على مفهوم مماثل أيضًا في C ++ ، أي فئة متداخلة. للوهلة الأولى ، قد تبدو الطبقات الداخلية زائدة بعض الشيء ، وقد لا تكون فائدتها مهمة بالنسبة للمبتدئين ، ولكن مع فهمها المتعمق ، ستجد أن مصممي Java يتمتعون بحسن نية بالفعل في الطبقات الداخلية. يعد تعلم استخدام الفصول الداخلية جزءًا من إتقان برمجة Java المتقدمة ، مما يسمح لك بتصميم بنية البرنامج بشكل أكثر أناقة. يتم تقديم ما يلي من الجوانب التالية:
الاجتماع الأول
محتويات الواجهة العامة {int value () ؛} الوجهة العامة {String readlabel () ؛} public class goods {private class contents تنفذ المحتويات {private int i = 11 ؛ public int value () {return i ؛ }} الفئة المحمية GDESTINENT تنفذ الوجهة {private string label ؛ gdestination الخاص (سلسلة Whereto) {label = whereto ؛ } السلسلة العامة readlabel () {return label ؛ }} Destination Dester (String s) {return new gdestination (s) ؛ } المحتويات العامة content () {return new content () ؛ }} class testgoods {public static void main (string [] args) {goods p = new Goods () ؛ المحتويات c = p.cont () ؛ الوجهة d = p.dest ("beijing") ؛ }}في هذا المثال ، يتم تعريف محتوى الفئات و gdestination داخل السلع الفئة ، ويحمي المعدلات الخاصة على التوالي للتحكم في مستوى الوصول. يمثل المحتوى محتوى البضائع ، بينما يمثل gdestination وجهة البضائع. يقومون بتنفيذ محتوى واجهتين ، على التوالي. في الطريقة الرئيسية أدناه ، استخدم المحتويات C والوجهة D مباشرة للعمل ، ولا ترى حتى أسماء هاتين الفئتين الداخليتين! وبهذه الطريقة ، تنعكس الفائدة الأولى للفصول الداخلية - عمليات إخفاء لا تريد أن يعرفها الآخرون ، أي التغليف.
في الوقت نفسه ، اكتشفنا أيضًا الطريقة الأولى للحصول على كائنات فئة داخلية خارج نطاق الفئة الخارجية ، أي استخدام طرق فئةها الخارجية لإنشاء وإعادة. هذه هي الطريقة التي تفعل بها أساليب Cont () و dest () في المثال أعلاه. فهل هناك أي طريقة أخرى؟ بالطبع ، تنسيق بناء الجملة كما يلي:
OuterObject = New Outerclass (معلمات المنشئ) ؛ outerclass.innerclass innerObject = OuterObject.new innerclass (معلمات المنشئ) ؛
لاحظ أنه عند إنشاء كائنات فئة داخلية غير قديمة ، يجب أولاً إنشاء كائنات الفئة الخارجية المقابلة. بالنسبة للسبب ، فإنه يؤدي أيضًا إلى موضوعنا التالي-
تحتوي كائنات الفئة الداخلية غير الاستقليوية على إشارات إلى كائنات الفئة الخارجية الخاصة بهم
القليل من التعديل على المثال الآن فقط:
سلع الطبقة العامة {Private Faluerate = 2 ؛ محتوى الفئة الخاصة ينفذ المحتويات {private int i = 11*valuerate ؛ public int value () {return i ؛ }} الفئة المحمية GDESTINENT تنفذ الوجهة {private string label ؛ gdestination الخاص (سلسلة Whereto) {label = whereto ؛ } السلسلة العامة readlabel () {return label ؛ }} Destination Dester (String s) {return new gdestination (s) ؛ } المحتويات العامة content () {return new content () ؛ }}يظهر الجزء المعدل باللون الأحمر. هنا نضيف متغيرًا خاصًا في فئة البضائع ، مما يعني معامل القيمة للبضائع. اضربها عندما تقوم قيمة طريقة محتوى الفئة الداخلية () بحساب القيمة. لقد وجدنا أن Value () يمكنه الوصول إلى التقييم ، وهو أيضًا الفائدة الثانية للفئات الداخلية - يمكن لكائن الفئة الداخلية الوصول إلى محتوى كائن الفئة الخارجي الذي أنشأته ، حتى بما في ذلك المتغيرات الخاصة! هذه ميزة مفيدة للغاية توفر لنا المزيد من الأفكار والاختصارات عند التصميم. لتنفيذ هذه الوظيفة ، يجب أن يكون لكائن الفئة الداخلية إشارة إلى كائن الفئة الخارجية. عندما ينشئ برنامج التحويل البرمجي Java كائن فئة داخلي ، فإنه يمرر ضمنيًا الإشارة إلى كائن الفئة الخارجية ويحفظه طوال الوقت. يتيح ذلك كائنات الفئة الداخلية للوصول دائمًا إلى كائنات الفئة الخارجية الخاصة بها ، وهذا أيضًا لماذا خارج نطاق إجراءات الفئة الخارجية ، يجب إنشاء كائن الفئة الخارجية أولاً.
قد يسأل بعض الأشخاص ، ماذا لو كان متغير الأعضاء في فئة داخلية هو نفس متغير العضو في فئة خارجية ، أي أن هناك متغيرًا عضوًا يحمل نفس الاسم في الفئة الخارجية؟ لا بأس ، تستخدم Java التنسيق التالي للتعبير عن الإشارات إلى الفئات الخارجية:
Outerclass. هذا
معها ، نحن لسنا خائفين من مثل هذه المواقف.
فئة داخلية ثابتة
مثل الفصول العادية ، يمكن أن تكون الفصول الداخلية ثابتة أيضًا. ومع ذلك ، بالمقارنة مع الطبقات الداخلية غير المستقلة ، فإن الفرق هو أن الطبقات الداخلية الثابتة ليس لها أي إشارات إلى الخارج. هذا في الواقع يشبه إلى حد كبير الطبقات المتداخلة في C ++. الفرق الأكبر بين الطبقات الداخلية Java و C ++ الفصول المتداخلة هو ما إذا كانت هناك إشارات إلى الخارج. بالطبع ، هناك اختلاف عن منظور التصميم وبعض التفاصيل منه.
بالإضافة إلى ذلك ، في أي فئة داخلية غير استاتيكية ، لا يمكن أن تكون هناك بيانات ثابتة أو طرق ثابتة أو فئة داخلية ثابتة أخرى (يمكن تداخل الفئة الداخلية أكثر من طبقة واحدة). ومع ذلك ، يمكن أن يكون لدى الطبقات الداخلية الثابتة كل هذا. هذا هو أيضا الفرق الثاني بين الاثنين.
الطبقات الداخلية المحلية
نعم ، يمكن أيضًا أن تكون الفصول الداخلية Java محلية ، ويمكن تعريفها في طريقة أو حتى كتلة رمز.
Public Class Goods1 {Public Destination Dest (String S) gdestination الخاص (سلسلة Whereto) {label = whereto ؛ } السلسلة العامة readlabel () {return label ؛ }} إرجاع gdestination (s) جديد ؛ } public static void main (string [] args) {goods1 g = new Goods1 () ؛ الوجهة D = G.Dest ("Beijing") ؛ }}هذا مثال أعلاه. في الطريقة التي نحدد بها فئة داخلية ، وأخيراً تقوم هذه الطريقة بإرجاع كائن هذه الفئة الداخلية. يمكن القيام بذلك إذا كنا بحاجة فقط إلى إنشاء أحد كائناته وإنشائه إلى الخارج عند استخدام فئة داخلية. بطبيعة الحال ، يمكن أن تنوع الطبقات الداخلية المحددة في الأساليب التصميمات ، والغرض ليس فقط بهذا المعنى.
هنا مثال أكثر غرابة:
public class goods2 {private void internalTracking (boolean b) {if (b) {class trackingslip {private string id ؛ trackingslip (سلسلة s) {id = s ؛ } string getLip () {return id ؛ }} trackingslip ts = new trackingslip ("slip") ؛ سلسلة s = ts.getSlip () ؛ }} public void track () {internalTracking (true) ؛ } public static void main (string [] args) {goods2 g = new Goods2 () ؛ G.Track () ؛ }}لا يمكنك إنشاء كائن من هذه الفئة الداخلية خارج IF ، لأن هذا يتجاوز نطاقه. ومع ذلك ، عند التجميع ، يتم تجميع TrackingsLip الداخلي في نفس الوقت مثل الفئات الأخرى ، ولكنه غير صالح إذا تجاوز هذا النطاق بسبب نطاقه الخاص. بصرف النظر عن هذا ، لا يختلف عن الطبقات الداخلية الأخرى.
فئة داخلية مجهولة
تبدو قواعد بناء الجملة في الطبقات الداخلية المجهولة في Java غريبة بعض الشيء ، ولكن مثل المصفوفات المجهولة ، عندما تحتاج فقط إلى إنشاء كائن من فئة ولا يمكنه استخدام اسمه ، فإن استخدام فئة داخلية يمكن أن يجعل الكود يبدو موجزًا ومسطحًا. قواعد بناء الجملة الخاصة بها هي كما يلي:
interfacename () {......} ؛ أو جديد SuperClassName () {......} ؛دعنا نستمر في تقديم مثال:
Class Public Comple3 {public contents content () {return new Contents () {private int i = 11 ؛ public int value () {return i ؛ }} ؛ }}هنا ، تستخدم الطريقة CONT () فئة داخلية مجهولة لإرجاع كائن مباشرة ينفذ فئة محتويات الواجهة ، والتي تبدو موجزة للغاية.
في محول مجهول لمعالجة الأحداث في جافا ، يتم استخدام فصول داخلية مجهولة على نطاق واسع. على سبيل المثال ، عندما تريد إغلاق النافذة ، أضف هذا الرمز:
frame.addwIndOwListener (new WindowAdapter () {public void windowclosing (windowevent e) {system.exit (0) ؛}}) ؛أحد الأشياء التي يجب ملاحظتها هو أنه نظرًا لأن الفئة الداخلية المجهولة ليس لها اسم ، فليس لها مُنشئًا (ولكن إذا كانت هذه الفئة الداخلية المجهولة ترث فئة أولياء الأمور التي تحتوي فقط على مُنشئ مع الوسائط ، فيجب عليك إحضار هذه المعلمات عند إنشاءها ، واستخدام الكلمة الرئيسية الفائقة لاستدعاء المحتوى المقابل أثناء عملية التنفيذ). إذا كنت ترغب في تهيئة متغيرات الأعضاء الخاصة بها ، فهناك عدة طرق:
إذا كانت فئة داخلية مجهولة المصدر للطريقة ، فيمكنك استخدام هذه الطريقة لتمرير المعلمات التي تريدها ، ولكن تذكر أنه يجب إعلان هذه المعلمات النهائية.
إصلاح الطبقة الداخلية المجهولة المصدر في الطبقة الداخلية المحلية المسمى بحيث يمكن أن يكون لها مُنشئ.
استخدم كتل رمز التهيئة في هذه الفئة الداخلية المجهولة.
لماذا تحتاج الفصول الداخلية؟
ما هي فوائد الطبقات الداخلية Java؟ لماذا تحتاج الفصول الداخلية؟
أولاً ، دعونا نعطي مثالاً بسيطاً. إذا كنت ترغب في تنفيذ واجهة ، ولكن طريقة واحدة في هذه الواجهة لها نفس الاسم والمعلمات كطريقة واحدة في الفصل الذي تخيلته ، ماذا يجب أن تفعل؟ في هذا الوقت ، يمكنك إنشاء فئة داخلية لتنفيذ هذه الواجهة. نظرًا لأن الفئة الداخلية متاحة لجميع محتويات الفصل الخارجي ، فإن القيام بذلك يمكن أن ينجز جميع الوظائف التي تنفذها مباشرةً هذه الواجهة.
ولكن قد تضطر إلى التشكيك ، أليس كذلك بما يكفي لتغيير الطريقة؟
في الواقع ، من غير المقنع حقًا استخدام هذا كسبب لتصميم الفئات الداخلية.
والسبب الحقيقي هو أن الطبقات والواجهات الداخلية في Java يتم دمجها لحل مشكلة تشكو من قبل مبرمجي C ++ - لا يوجد المزيد من الميراث. في الواقع ، فإن التعددية المتعددة لـ C ++ معقدة للغاية للتصميم ، ويمكن لـ Java تحقيق تأثير متعدد الأطوار من خلال الطبقات الداخلية والواجهات.
ملخص الفئة الداخلية Java
(1) فئة داخلية غير متتالية محددة بين الأساليب:
● يمكن للدروس المحيطية والداخلية الوصول إلى أعضائهم الخاصين من بعضهم البعض.
● لا يمكن تحديد متغيرات الأعضاء الثابتة في الفصل الداخلي.
خارج نطاق الفئة الخارجية ، لإنشاء كائن فئة داخلي ، يجب أولاً إنشاء كائن الفئة الخارجية الخاصة به
(2) فئة داخلية ثابتة محددة بين الطرق:
● يمكن الوصول إلى الأعضاء الثابتين فقط من الفصول الخارجية.
ليس للطبقة الداخلية الثابتة أي إشارات إلى الخارج
(3) الفئة الداخلية المحلية المحددة في الطريقة:
● لا تحتوي هذه الفئة الداخلية على أذونات التحكم في الوصول
● لا يمكن للفئة المحيطية رؤية الفئة الداخلية المحلية في هذه الطريقة ، ولكن يمكن للفئة الداخلية المحلية الوصول إلى أي عضو في الفئة المحيطية.
● يمكن الوصول إلى الفصول الداخلية المحلية في هيئة الطريقة ، ولكن يجب أن يكون بيان الوصول بعد تحديد الفصول الداخلية المحلية.
● لا يمكن للفصول الداخلية المحلية الوصول إلى الثوابت إلا في هيئة الطريقة ، أي الأعضاء المعدلة مع النهائي.
(4) فئة داخلية مجهولة المصدر محددة في الطريقة:
● لا يوجد مُنشئ ، بدلاً من ذلك تمرير معلمات المنشئ إلى مُنشئ الفئة الفائقة
عندما تحتاج فقط إلى إنشاء كائن من فئة ولا تستخدم اسمه ، يمكن أن يؤدي استخدام الفئات الداخلية المجهولة إلى جعل الكود يبدو موجزًا واضحة.
إن المقالة أعلاه تتفهم بشكل شامل فصول داخلية ومجهولة في Java هي كل المحتوى الذي شاركته معك. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.