لقد قمنا دائمًا بتعريف الفئات لإنشاء الكائنات. الكائنات هي كيانات ذات وظائف، في حين أن الفئات هي تصنيفات نوع الكائنات. هذا هو المفهوم الأساسي للكائنات.
في الميراث، نتعامل مع الفئات كمواضيع قابلة للتوسيع، مما يحسن فهمنا "للفئات".
هناك الكثير مما يمكن مناقشته حول الفصل نفسه. وسوف نستمر في تعميق
أعضاء البيانات الثابتة
هناك بعض البيانات المستخدمة للتعبير عن حالة الفصل. على سبيل المثال، في فئة الإنسان، يمكننا استخدام "السكان" لتمثيل العدد الإجمالي للكائنات في فئة الإنسان. يصف "السكان" بشكل مباشر حالة الطبقة، وليس الكائن.
الطبقة البشرية يبلغ عدد سكانها 8
تشترك جميع كائنات الفئة في البيانات "السكانية". تسمى هذه البيانات عضو بيانات الفئة (حقل الفئة).
في تعريف الفئة، نستخدم الكلمة الأساسية الثابتة للإعلان عن أعضاء بيانات الفئة، مثل:
انسخ رمز الكود كما يلي:
com.classHuman
{
/**
* منشئ
*/
الإنسان العام (كثافة العمليات ح)
{
this.height = h;
}
/**
*الملحقات
*/
كثافة العمليات العامة getHeight()
{
إرجاع هذا الارتفاع؛
}
/**
* متحور
*/
نمو الفراغ العام (int h)
{
this.height = this.height + h;
}
/**
*يتنفس
*/
التنفس الفراغي العام ()
{
System.out.println("هو...هو...");
}
ارتفاع كثافة العمليات الخاصة؛
عدد السكان الثابت الخاص؛
المنطق المنطقي العام الثابت is_mammal = true;
}
نحدد عضوين من بيانات الفصل: السكان وis_mammal. تشترك جميع الكائنات البشرية في بيانات سكانية؛ وتكون السمة is_mammal (الثدييات) لأي كائن بشري صحيحة.
يحتاج أعضاء بيانات الفصل أيضًا إلى تعيين أذونات الوصول. بالنسبة لأعضاء بيانات الفئة المعلن عنها على أنها عامة، يمكن الوصول إليها مباشرة من الخارج باستخدام class.field أو object.field (في حالة وجود كائن من هذه الفئة). تعد كلتا طريقتي الوصول معقولتين لأنه يمكن اعتبار أعضاء بيانات الفصل كسمات للفئة ويمكن اعتبارهم سمات مشتركة بين جميع الأعضاء. إذا تم تعريف عضو بيانات الفصل على أنه خاص، فلا يمكن الوصول إلى عضو بيانات الفصل إلا من داخل الفصل.
(تم تعيين Is_mammal على الوضع العام أعلاه فقط للتوضيح. وهذا أمر خطير للغاية. إذا استخدم شخص ما Human.is_mammal=false؛ فسوف يعاني جميع البشر. ومرة أخرى، المبدأ الأساسي هو ضبط البيانات على خصوصية قدر الإمكان.)
طريقة ثابتة
يمكن أن يكون لدينا أيضًا طرق فئة، وهي طرق تم تعريفها على أنها ثابتة. تمثل أساليب الفصل الإجراءات التي يمكن للفئة تنفيذها، ولا تتضمن العمليات كائنًا محددًا. إذا تم تعريف الطريقة بأنها ثابتة، فيمكنها فقط استدعاء البيانات والأساليب الثابتة، ولكن ليس البيانات والأساليب غير الثابتة.
في الواقع، في الطريقة الثابتة، لن يتم تمرير هذه المعلمات والمعلمات الفائقة ضمنيًا. ليس لدينا طريقة للإشارة إلى البيانات والأساليب الخاصة بالكائن (وهذا بالضبط ما نريده).
وبناء على ما سبق، تصبح لدينا العلاقة التالية:
يشير الخط الأحمر المنقط إلى عدم إمكانية الوصول. بمعنى آخر، لا يمكن الوصول إلى بيانات الكائن باستخدام أساليب الفصل.
بعد ذلك، نضيف طريقة ثابتة getPopulation()، والتي تُرجع مجموعة البيانات الثابتة:
انسخ رمز الكود كما يلي:
com.classHuman
{
/**
* منشئ
*/
الإنسان العام (كثافة العمليات ح)
{
this.height = h;
}
/**
*الملحقات
*/
كثافة العمليات العامة getHeight()
{
إرجاع هذا الارتفاع؛
}
/**
* متحور
*/
نمو الفراغ العام (int h)
{
this.height = this.height + h;
}
/**
*يتنفس
*/
التنفس الفراغي العام ()
{
System.out.println("هو...هو...");
}
ارتفاع كثافة العمليات الخاصة؛
/*
* طريقة ثابتة، الوصول إلى السكان
*/
int العام الثابت getPopulation ()
{
عودة Human.population;
}
عدد السكان الثابت الخاص؛
منطقية ثابتة خاصة is_mammal = true؛
}
عند استدعاء أسلوب فئة، يمكننا استدعاؤه من خلال class.method() أو object.method(). على سبيل المثال، استخدم اختبار فئة الاختبار التالي:
انسخ رمز الكود كما يلي:
اختبار الطبقة العامة
{
الفراغ العام الثابت الرئيسي (String[] args)
{
System.out.println(Human.getPopulation());
الإنسان aPerson = الإنسان الجديد (160)؛
System.out.println(aPerson.getPopulation());
}
}
لقد قمنا بتسمية طريقة الفصل getPopulation() خارج تعريف الفصل بطريقتين.
تقوم أساليب الكائن بتعديل بيانات الفئة
نرى أن أساليب الكائن يمكنها الوصول إلى بيانات الفئة. هذا هو مفهوم مفيد جدا. قد تتغير حالة الفئة مع الكائنات. على سبيل المثال، يجب أن يزيد عدد السكان بمقدار 1 عند إنشاء الكائن. يمكننا تعديل البيانات "السكانية" للفئة في أساليب الكائن. يمكننا الوصول إلى أعضاء بيانات الفصل في المُنشئ أدناه. طريقة البناء هنا هي طريقة غير ثابتة، أي طريقة كائن:
انسخ رمز الكود كما يلي:
com.classHuman
{
/**
* منشئ
*/
الإنسان العام (كثافة العمليات ح)
{
this.height = h;
Human.population = Human.population + 1;
}
/**
*الملحقات
*/
كثافة العمليات العامة getHeight()
{
إرجاع هذا الارتفاع؛
}
/**
* متحور
*/
نمو الفراغ العام (int h)
{
this.height = this.height + h;
}
/**
*يتنفس
*/
التنفس الفراغي العام ()
{
System.out.println("هو...هو...");
}
ارتفاع كثافة العمليات الخاصة؛
/*
* طريقة ثابتة، الوصول إلى السكان
*/
int العام الثابت getPopulation ()
{
عودة Human.population;
}
عدد السكان الثابت الخاص؛
منطقية ثابتة خاصة is_mammal = true؛
}
في كل مرة نقوم بإنشاء كائن، نقوم بتعديل بيانات الفئة من خلال طريقة بناء الكائن وزيادة بيانات فئة السكان بمقدار 1. بهذه الطريقة، يمكن أن يعكس السكان إجمالي عدد الكائنات التي تنتمي إلى هذه الفئة في الوقت الفعلي (يمكنك إنشاء كائنات متعددة في الاختبار ثم طباعة Human.population).
بالإضافة إلى مثال المنشئ المذكور أعلاه، يمكننا أيضًا الوصول إلى بيانات الفئة بطرق الكائنات العادية.
أخير
المعنى الأساسي للكلمة الأساسية النهائية هو: لا يمكن تغيير هذه البيانات/الطريقة/الفئة.
1. بيانات النوع الأساسي النهائية: قيمة ثابتة، والتي يمكن تعيينها مرة واحدة فقط ولا يمكن تعديلها مرة أخرى.
2. الطريقة النهائية: لا يمكن تجاوز هذه الطريقة. الأساليب الخاصة الافتراضية للطرق النهائية.
3.الفئة النهائية: لا يمكن توريث هذه الفئة.
يمكن أن تحتوي كائنات الأنواع العادية أيضًا على الكلمة الأساسية النهائية، مما يعني أنه لم يعد من الممكن تعديل مرجع الكائن (المرجع). أي أن المرجع يمكن أن يشير إلى كائن واحد فقط. ومع ذلك، يمكن أن تتغير محتويات الكائن (على غرار المؤشرات الثابتة في لغة C). سنقوم بتغطية مراجع الكائنات لاحقًا.
إذا كان النوع الأساسي من البيانات نهائيًا وثابتًا، فإنه يخزن نسخة واحدة فقط من القيمة الثابتة. يعد هذا أمرًا رائعًا لتخزين الثوابت مثل pi.
تلخيص
حقل ثابت، طريقة ثابتة
class.static_method()
أخير