الفئات المجهولة هي فئات لا يمكن أن يكون لها أسماء، لذا لا توجد طريقة للإشارة إليها. ويجب الإعلان عنها كجزء من البيان الجديد في وقت الإنشاء. يتطلب هذا نموذجًا آخر من البيان الجديد، كما يلي: <class or Interface> الجديد <body of class> هذا النموذج من البيان الجديد يعلن عن فئة مجهولة جديدة تعمل على توسيع فئة معينة أو تنفيذ واجهة معينة. كما يقوم أيضًا بإنشاء مثيل جديد لتلك الفئة وإرجاعه كنتيجة للبيان. الفئة التي سيتم توسيعها والواجهة التي سيتم تنفيذها هي معاملات البيان الجديد، متبوعة بنص الفئة المجهولة. إذا قامت فئة مجهولة بتوسيع فئة أخرى، فيمكن لجسمها الوصول إلى أعضاء الفئة، وتجاوز أساليبها، وما إلى ذلك، تمامًا مثل أي فئة قياسية أخرى. إذا قامت فئة مجهولة بتنفيذ واجهة، فيجب على جسمها تنفيذ أساليب الواجهة.
كود جافا
انسخ رمز الكود كما يلي:
واجهة العلاقات العامة
{
طباعة باطلة 1();
}
الطبقة العامة noNameClass
{
وجهة العلاقات العامة العامة ()
{
إرجاع العلاقات العامة الجديدة () {
طباعة الفراغ العام 1 ()
{
System.out.println("مرحبا بالعالم!!");
}
};
}
الفراغ العام الثابت الرئيسي (سلسلة الحجج [])
{
noNameClass c = new noNameClass();
pr hw=c.dest();
hw.print1();
}
}
يمكن أن تكون العلاقات العامة أيضًا فئة، ولكن الطريقة التي تستدعيها خارجيًا يجب أن يتم الإعلان عنها في صفك أو الواجهة الخاصة بك، ولا يمكن استدعاء الأساليب الموجودة داخل الفئة المجهولة من الخارج.
ربما يكون المكان الأكثر استخدامًا للفئات المجهولة الداخلية في Java هو إضافة Listner إلى Frame.
على النحو التالي:
كود جافا
انسخ رمز الكود كما يلي:
import java.awt.*;
import java.awt.event.*;
الطبقة العامة QFrame تمتد الإطار {
إطار QFrame العام () {
this.setTitle(/"تطبيقي/");
addWindowListener(new WindowAdapter() {
نافذة فارغة عامة (WindowEvent e) {
التخلص();
System.exit(0);
}
});
this.setBounds(10,10,200,200);
}
}
تهدف الفئة الداخلية المجهولة إلى إنشاء فئة داخلية، ولكنها لا تعطيك اسمًا، أي أنه لا يوجد متغير يشير إلى المثيل.
انسخ رمز الكود كما يلي:
محول نافذة جديد () {
نافذة فارغة عامة (WindowEvent e) {
التخلص();
System.exit(0);
}
}
الجديد هو إنشاء كائن WindowAdapter، ويشير ما يلي {} إلى أن العملية بين الأقواس تعمل على اسم الكائن الافتراضي، وما يلي في برنامج Java أعلاه هو نص وظيفي.
الغرض من هذا الاستخدام هو إنشاء مثيل لكائن وتجاوز إحدى وظائفه. يمكنك العثور عليه عن طريق فتح كود WindowAdapter. إنها فئة مجردة. إنه تطبيق لواجهة WindowListener. معلمة Frame.addWindowListner(); هي WindowListner، والتنفيذ هو تمرير فئة مجهولة مشتقة من WindowAdapter.
1. كيفية تحديد وجود فئة مجهولة؟ لا أستطيع رؤية الاسم، يبدو أنه مجرد كائن تم إنشاؤه بواسطة جديد من الفئة الأصل، ولا يوجد اسم للفئة المجهولة.
دعونا نلقي نظرة على الكود الكاذب أولاً
انسخ رمز الكود كما يلي:
فئة مجردة الأب () {
....
}
اختبار الطبقة العامة {
Father f1 = new Father(){ .... } // توجد فئة داخلية مجهولة هنا
}
بشكل عام، عندما يكون هناك كائن جديد، يجب أن تكون هناك فاصلة منقوطة بعد الأقواس، أي أن بيان الكائن الجديد ينتهي.
لكن الأمر يختلف عندما تكون هناك فئات داخلية مجهولة، تليها الأقواس بأقواس، وتحتوي الأقواس على طريقة التنفيذ المحددة للكائن الجديد.
لأننا نعلم أن فئة مجردة لا يمكن أن تكون جديدة مباشرة، يجب أن تكون هناك فئة تنفيذ قبل أن نتمكن من تجديد فئة التنفيذ الخاصة بها.
يشير الكود الكاذب أعلاه إلى أن الجديد هو فئة التنفيذ الخاصة بالأب، وأن فئة التنفيذ هذه هي فئة داخلية مجهولة.
في الواقع، يمكن تقسيم الطبقة الداخلية المجهولة أعلاه
انسخ رمز الكود كما يلي:
فئة SonOne يمتد الأب {
...// الكود هنا هو نفس الفئة الداخلية المجهولة أعلاه، الكود بين قوسين متعرجين
}
اختبار الطبقة العامة {
الأب f1 = new SonOne();
}
2. احتياطات للفئات الداخلية المجهولة لاحظ أن الإعلان عن الفئات المجهولة يتم في وقت الترجمة، ويتم إنشاء مثيل في وقت التشغيل. هذا يعني أن عبارة جديدة في حلقة for ستنشئ عدة مثيلات لنفس الفئة المجهولة، بدلاً من إنشاء مثيل واحد لعدة فئات مجهولة مختلفة.
عند استخدام الفئات الداخلية المجهولة، ضع المبادئ التالية في الاعتبار:
・لا يمكن أن تحتوي الفئات الداخلية المجهولة على مُنشئين.
・لا يمكن للفئات الداخلية المجهولة تحديد أي أعضاء أو أساليب أو فئات ثابتة.
・لا يمكن أن تكون الفئات الداخلية المجهولة عامة أو محمية أو خاصة أو ثابتة.
・يمكن إنشاء مثيل واحد فقط لفئة داخلية مجهولة.
・يجب أن تكون الطبقة الداخلية المجهولة خلف فئة جديدة، ويتم استخدامها لتنفيذ واجهة ضمنيًا أو تنفيذ فئة.
・نظرًا لأن الفئات الداخلية المجهولة هي فئات داخلية محلية، فإن جميع القيود المفروضة على الفئات الداخلية المحلية تسري عليها.
・يمكن للفئات الداخلية الوصول فقط إلى المتغيرات الثابتة أو الأساليب الثابتة للفئات الخارجية.
هذا في الطبقات المجهولة والطبقات الداخلية:
في بعض الأحيان، سوف نستخدم بعض الفئات الداخلية والفئات المجهولة. عند استخدام هذا في فئة مجهولة، يشير هذا إلى الفئة المجهولة أو الفئة الداخلية نفسها. في هذا الوقت، إذا أردنا استخدام أساليب ومتغيرات الفئة الخارجية، فيجب علينا إضافة اسم الفئة للفئة الخارجية
3. دور الطبقات الداخلية المجهولة
تختلف فئات Java الداخلية بشكل أساسي عن الفئات المتداخلة في C++: لا تحتوي فئات C++ المتداخلة على مقابض لفئات التغليف. إنه يعبر فقط عن مفهوم التغليف؛ لكن فئة Java الداخلية مختلفة، ويمكنها الوصول إلى أعضاء فئة التغليف (مما يعني أن لديها مؤشرًا لفئة التغليف).
تعد الفئات الداخلية المجهولة طريقة مبسطة لكتابة الفئات الداخلية: return new Wrapper {
...
};
يعادل: ملفوف يمتد الغلاف {
...
}
إرجاع ملفوف جديد ()؛
هل هذا هو الدور الوحيد للطبقات الداخلية المجهولة؟
النظر في هذه الحالة:
انسخ رمز الكود كما يلي:
واجهة ايكونت {
عدد صحيح () ؛
}
فئة الوالدين {
كثافة العمليات ط = 0؛
عدد صحيح () {
إرجاع i++;
}
}
هناك فئة فرعية لا تريد فقط أن ترث طريقة العد () الخاصة بالوالد، ولكنها تريد أيضًا تنفيذ طريقة العد في واجهة ICount. ماذا علي أن أفعل في هذا الوقت؟ يمكن أن تلعب الطبقات الداخلية دورًا:
انسخ رمز الكود كما يلي:
فئة الطفل تمتد الأصل {
ICount getCount() {
إرجاع Icount الجديد {
كثافة العمليات ط = 0؛
عدد صحيح () {
العودة (ط * = 2)؛
}
}
}
}
انظر إلى هذا الرمز
انسخ رمز الكود كما يلي:
public static void main(String[] args) {
theApp = new Analyzer();
SwingUtilities.invocateLater(new Runnable() { // فئة Runnable مجهولة
// هدف
public void run() { // طريقة التشغيل التي تم تنفيذها في الموضوع
theApp.creatGUI(); // اتصل بمنشئ واجهة المستخدم الرسومية الثابتة
}
});
}
public static void main(String[] args) {
theApp = new Analyzer(); // إنشاء كائن
SwingUtilities.invocateLater(new Runnable() { // فئة Runnable مجهولة
// فئة داخلية مجهولة تنفذ سلسلة رسائل
// في الأصل كانت هذه الطريقة هي تمرير معلمة نوع قابلة للتشغيل // يمكن تحقيق ذلك من خلال طريقة الفئة المجهولة هذه
// هدف
public void run() { // طريقة التشغيل التي تم تنفيذها في الموضوع
theApp.creatGUI(); // اتصل بمنشئ واجهة المستخدم الرسومية الثابتة
}
});
}