الأساليب الثابتة والمتغيرات في Java. الأعضاء المشتركين في كائنات الفصل. الخصائص والأساليب الثابتة

طرق النوع الثابتهي أداة إطار لغة تم تنفيذها للعمل مع أعضاء البيانات الثابتة. ويمكن تقسيم هذه الأساليب إلى نوعين:

    الأساليب الثابتة في الفئات الثابتة؛

    الأساليب الثابتة في الفئات غير الثابتة.

إذا أعلن مبرمج عن فئة ثابتة، فإن جميع أعضاء هذه الفئة تصبح ثابتة، بما في ذلك الأساليب. هذه هي طرق الفئات - حاويات التعليمات التي تقبل كائنات من أنواع أخرى للمعالجة وتنتج قيمة النوع التي يحتاجها المبرمج.

الحالة الأكثر شيوعًا هي عندما يحتاج المبرمج إلى تنفيذ مجموعة من التعليمات المستقلة عن كائن الكتابة. مجموعة التعليمات هذه هي طريقة ثابتة، حيث يتم استدعاؤها قبل إنشاء مثيل من النوع.

إعلان واستدعاء طريقة ثابتة

يتم تعريف الطريقة بأنها ثابتة باستخدام الكلمة الأساسية الثابتة قبل نوع الإرجاع في تعريف الطريقة في نطاق الفئة:

فئة عامة Somenonstaticclass ( // أعلن عن الحقول الثابتة. static int firststaticfield; static string Secondstaticfield; // أعلن عن الحقول غير الساكنة. double firstnonstaticfield; float Secondnonstaticfield; // أعلن عن طريقة ثابتة. static void FirstStaticMethod() ( // تنفيذ أ طريقة ثابتة. WriteLine(firststaticfield);

يمكن للمبرمج استدعاء طريقة ثابتة عبر اسم النوع الذي تم تعريفه فيه:

فئة UseStaticMethods ( static void Main() ( // استدعاء طريقة ثابتة عبر اسم النوع. Somenonstaticclass.FirstStaticMethod(); ) )

قيود على الاستخدام

الأساليب الثابتة لا تشارك في الميراث. أنها مختومة. لا يمكن إلا أن تكون مثقلة، ولكن لا يمكن إعادة تعريفها. يتم التعبير عن القيد في حقيقة أن الأساليب الثابتة تنتمي إلى الفئة التي تم تعريفها فيها، والأساليب غير الثابتة تنتمي إلى كائن الفئة.

فئة عامة Somenonstaticclass ( // قم بتعريف الحقول الثابتة للفئة static int firststaticfield; static string Secondstaticfield; double firstnonstaticfield; float Secondnonstaticfield; // أعلن عن طريقة ثابتة. static void FirstStaticMethod() ( // تنفيذ الطريقة الثابتة. وحدة التحكم .WriteLine(firststaticfield); Console.WriteLine( Secondstaticfield); // قم بتحميل طريقة FirstStaticMethod().

الأساليب الثابتة للفئة غير الثابتة في كتلة التنفيذ لها حق الوصول فقط إلى الأعضاء الثابتين. لا يمكنك استخدام أعضاء غير ثابتين في الأساليب الثابتة:

فئة عامة Somenonstaticclass ( // قم بتعريف الحقول الثابتة للفئة static int firststaticfield; static string Secondstaticfield; double firstnonstaticfield; float Secondnonstaticfield; // أعلن عن طريقة ثابتة. static void FirstStaticMethod() ( // تنفيذ الطريقة الثابتة. وحدة التحكم .WriteLine(firststaticfield); Console.WriteLine( Secondstaticfield); Console.WriteLine(firstnonstaticfield); // سيتسبب السطر في حدوث خطأ في الترجمة لأنه يتم استخدام عضو غير ثابت داخل عضو ثابت.

ثم يمكننا الوصول إليها مباشرة من خلال اسم الفئة ومشغل دقة النطاق. ولكن ماذا لو كانت متغيرات الأعضاء الثابتة خاصة؟ خذ بعين الاعتبار الكود التالي:

في هذه الحالة، لا يمكننا الوصول مباشرةً إلى Anything::s_value من main() نظرًا لأن هذا العضو خاص. عادةً، يتم الوصول إلى الأعضاء الخاصين في الفصل من خلال الطرق العامة. بينما يمكننا إنشاء طريقة عادية للوصول إلى s_value، سيتعين علينا بعد ذلك إنشاء كائن من تلك الفئة لاستخدام هذه الطريقة! هناك خيار أفضل - يمكننا أن نجعل الطريقة ثابتة.

مثل متغيرات الأعضاء الثابتة، لا ترتبط الأساليب الثابتة بأي كائن فئة واحدة. هذا هو المثال أعلاه، ولكن بطريقة ثابتة:

فئة أي شيء (خاص: static int s_value؛ public: static int getValue() (return s_value;) // طريقة ثابتة)؛ int أي شيء::s_value = 3; // تعريف متغير العضو الثابت للفئة int main() ( std::cout<< Anything::getValue() << "\n"; }

نظرًا لأن الطرق الثابتة غير مرتبطة بكائن معين، فيمكن استدعاؤها مباشرة من خلال اسم الفئة وعامل تحليل النطاق، ويمكن أيضًا استدعاؤها من خلال كائنات الفئة (ولكن هذا غير مستحسن).

لا تحتوي الطرق الثابتة على هذا المؤشر *

الأساليب الثابتة لها ميزتان مثيرتان للاهتمام. أولاً، نظرًا لأن الأساليب الثابتة غير مرتبطة بكائن ما، فهي لا تحتوي على ! وهذا أمر منطقي، لأن هذا المؤشر يشير دائمًا إلى الكائن الذي تعمل عليه الطريقة. قد لا تعمل الأساليب الثابتة من خلال كائن، لذلك ليس هناك حاجة لهذا المؤشر.

ثانيًا، يمكن للطرق الثابتة الوصول مباشرةً إلى الأعضاء الثابتين الآخرين (المتغيرات أو الوظائف)، لكن لا يمكنها الوصول إلى الأعضاء غير الثابتين. وذلك لأن الأعضاء غير الثابتين ينتمون إلى كائن الفئة، لكن الأساليب الثابتة لا تنتمي إليه!

مثال آخر

يمكن تعريف الأساليب الثابتة خارج نص الفصل. هذا يعمل بنفس الطريقة كما هو الحال مع الطرق العادية. على سبيل المثال:

فئة IDGenerator (خاص: static int s_nextID؛ // إعلان متغير عضو ثابت public: static int getNextID(); // إعلان طريقة ثابتة)؛ // تعريف متغير العضو الثابت يقع خارج نص الفصل. يرجى ملاحظة أننا لا نستخدم الكلمة الأساسية الثابتة هنا // ابدأ في إنشاء المعرفات عند 1 int IDGenerator::s_nextID = 1; // تعريف الطريقة الثابتة يقع خارج نص الفصل. يرجى ملاحظة أننا لا نستخدم الكلمة الأساسية الثابتة هنا int IDGenerator::getNextID() ( return s_nextID++; ) int main() ( for (int count=0; count< 4; ++count) std::cout << "The next ID is: " << IDGenerator::getNextID() << "\n"; return 0; }

مولد معرف الفئة

خاص :

ثابت int s_nextID ؛ // إعلان متغير عضو ثابت

عام:

ثابت int getNextID(); // إعلان طريقة ثابتة

// ابدأ في إنشاء المعرف من 1

int IDGenerator::s_nextID = 1;

int IDGenerator::getNextID() (إرجاع s_nextID++;)

انت مين()

لـ (عدد العمليات = 0؛ عدد< 4 ; ++ count )

الأمراض المنقولة جنسيا::كوت<< "The next ID is: " << IDGenerator :: getNextID () << "\n" ;

العودة 0 ;

نتيجة:

المعرف التالي هو: 1
المعرف التالي هو: 2
المعرف التالي هو: 3
المعرف التالي هو: 4

يرجى ملاحظة أنه نظرًا لأن جميع المتغيرات والوظائف في هذه الفئة ثابتة، فلا نحتاج إلى إنشاء كائن من هذه الفئة للعمل معه! يتم استخدام متغير عضو ثابت لتخزين قيمة المعرف التالي الذي سيتم تعيينه له، ويتم استخدام طريقة ثابتة لإرجاع المعرف وزيادته.

تحذير بشأن الفئات التي تحتوي على جميع الأعضاء الثابتين

كن حذرًا عند كتابة الفصول الدراسية مع جميع الأعضاء الثابتين. في حين أن مثل هذه "الفئات الثابتة البحتة" يمكن أن تكون مفيدة، إلا أن لها عيوبها أيضًا.

أولاً، بما أن جميع الأعضاء الثابتين يتم إنشاؤهم مرة واحدة فقط، فلا يمكن أن تكون هناك نسخ متعددة من "فئة ثابتة بحتة" (دون استنساخ الفئة ثم إعادة تسميتها). على سبيل المثال، إذا كنا بحاجة إلى كائنين IDGenerator مستقلين، فلن يكون هذا ممكنًا من خلال فئة "ثابتة تمامًا".

ثانيًا، نعلم من الدرس o أن المتغيرات العامة خطيرة لأن أي جزء من التعليمات البرمجية يمكن أن يغير قيمه وسينتهي به الأمر بتغيير أجزاء أخرى من التعليمات البرمجية التي تبدو غير ذات صلة (مزيد من التفاصيل). وينطبق الشيء نفسه على الفئات "الثابتة تمامًا". نظرًا لأن جميع الأعضاء ينتمون إلى الفصل (وليس كائناته)، والفئات لها نطاق عالمي، فإننا في "فئة ثابتة بحتة" نعلن عن الوظائف والمتغيرات العالمية بكل السلبيات الموجودة فيها.

C++ لا يدعم المنشئات الثابتة

إذا كان بإمكانك تهيئة متغير عضو عادي عبر، فمن المنطقي أن تكون قادرًا على تهيئة متغيرات الأعضاء الثابتة عبر مُنشئ ثابت. وعلى الرغم من أن بعض اللغات الحديثة تدعم المنشئات الثابتة لهذا الغرض بالذات، إلا أن C++، لسوء الحظ، ليست واحدة منها.

إذا كان من الممكن تهيئة المتغير الثابت الخاص بك مباشرةً، فلن تكون هناك حاجة إلى مُنشئ: يمكنك تحديد متغير عضو ثابت حتى لو كان خاصًا. نقوم بذلك في المثال أعلاه باستخدام s_nextID. وهنا مثال آخر:

فئة شيء (عام: ثابت std::vector s_mychars; ); الأمراض المنقولة جنسيا::ناقل شيء::s_mychars = ( "o"، "a"، "u"، "i"، "e" ); // تحديد متغير عضو ثابت

فئة شيء

عام:

ثابت الأمراض المنقولة جنسيا::vector< char >s_mychars ;

الأمراض المنقولة جنسيا::ناقل< char >شيء :: s_mychars = ( "o" , "a" , "u" , "i" , "e" ) ; // تحديد متغير عضو ثابت

إذا كانت تهيئة متغير العضو الثابت الخاص بك تتطلب تنفيذ تعليمات برمجية (مثل حلقة)، فهناك عدة طرق مختلفة للقيام بذلك. الطريقة التالية هي الأفضل. على الرغم من أن هذا قد يكون معقدًا بعض الشيء (في الوقت الحالي) وربما لن تحتاج إليه أبدًا، إلا أنه يمكنك تخطي بقية هذا البرنامج التعليمي بأمان إذا كنت ترغب في ذلك.

#يشمل #يشمل فئة شيء (خاص: ثابت std::vector s_mychars; public: class _nested // تحديد فئة متداخلة تسمى _nested ( public: _nested() // يقوم المُنشئ _nested بتهيئة متغير العضو الثابت الخاص بنا ( s_mychars.push_back("o"); s_mychars.push_back("a"); s_mychars.push_back ("u")؛ s_mychars.push_back("i"); // طريقة ثابتة لإخراج s_mychars static void getSomething() ( for (auto const &element: s_mychars) std::cout<< element << " "; } private: static _nested s_initializer; // используем статический объект класса _nested для гарантии того, что конструктор _nested выполнится }; std::vectorشيء::s_mychars; // حدد متغير العضو الثابت الخاص بنا Something::_nested Something::s_initializer; // حدد s_initializer الثابت الخاص بنا، والذي سيستدعي المُنشئ _nested لتهيئة s_mychars int main() ( Something::getSomething(); return 0; )

#يشمل

#يشمل

فئة شيء

خاص :

ثابت الأمراض المنقولة جنسيا::vector< char >s_mychars ;

عام:

class_nested // تحديد فئة متداخلة تسمى _nested

عام:

متداخلة () // يقوم المُنشئ _ المتداخل بتهيئة متغير العضو الثابت الخاص بنا

s_mychars. Push_back("س");

s_mychars. Push_back("أ");

s_mychars. Push_back("u");

s_mychars. Push_back("أنا");

s_mychars. Push_back("e");

يتم تطبيق المعدل الثابت على المتغيرات والأساليب وحتى الأجزاء الفردية من التعليمات البرمجية التي لا تشكل جزءًا من الطريقة. لا تنتمي أجزاء التعليمات البرمجية الثابتة إلى كائن الفئة، بل إلى الفئة بأكملها.

دعونا نلقي نظرة على مثال لفئة بسيطة مع متغير ثابت واحد:

1. فئة النشوة(
2. static int x = 0;
3. النشوة () ( x++; )
4. }

تم تعريف المتغير x بأنه ثابت. هذا يعني أنه لا يهم عدد كائنات النشوة الموجودة في هذه اللحظة - هناك علامة x واحدة فقط. عند تحميل فئة Ecstatic، يتم تخصيص 4 بايت للمتغير x. وتحدث التهيئة (انظر السطر رقم 2) أيضًا في لحظة تحميل الفصل. وفي كل مرة يتم إنشاء كائن منتشي، تتم زيادة x. تتيح لك هذه التقنية معرفة العدد الدقيق لكائنات فئة Ecstatic التي تم إنشاؤها.

هناك طريقتان للوصول إلى المتغيرات الثابتة:

  • من خلال أي كائن فئة: object.variable.
  • من خلال الفصل نفسه: class.variable.

لكن الطريقة الأولى تعتبر سيئة الشكل لأنها مضللة للغاية. دعونا ننظر إلى هذا مع مثال:



3.e1.x = 100;
4.e2.x = 200;
5.realImportantVariable = e1.x;

إذا كنت لا تعرف مسبقًا أن x هو متغير ثابت، فقد تعتقد أنه في السطر الخامس تم تعيين المتغير realImportantVariable بـ 100. ولكن في الواقع تم تعيينه بـ 200، لأن e1.x وe2.x متماثلان. نفس المتغير x

لذلك، من الأفضل الوصول إلى المتغيرات الثابتة من خلال اسم الفئة. فيما يلي مقتطف رمز مكافئ للمقتطف السابق:

1. النشوة e1 = النشوة الجديدة () ؛
2. Ecstatic e2 = new Ecstatic();
3. النشوة.x = 100؛ // عمل لا طائل منه
4. النشوة.x = 200؛
5.realImportantVariable = Ecstatic.x;

الآن أصبح كل شيء في مكانه الصحيح: السطر 3 ليس له أي معنى - إنه مجرد عملية إضافية، وفي السطر 5 تم تعيين المتغير "relyImportantVariable" بـ 200 مرة واحدة.


لا يمكن للطرق الثابتة استخدام أعضاء غير ثابتين (المتغيرات والأساليب) من فئتها، ولكن يمكنها استخدام أعضاء ثابتين آخرين. الأساليب الثابتة لا تنتمي إلى أي كائن من الفئة. لذلك، يمكن بشكل عام استدعاؤها قبل إنشاء مثيل للفئة.

يحتوي كل تطبيق Java على طريقة main() ثابتة:

1. فئة SomeClass (
2. static int i = 48;
3.int j = 1;
4.
5. الفراغ الرئيسي العام (وسائط السلسلة) (
6.أنا += 100;
7. // ي *= 5; إذا قمت بإلغاء التعليق، سيكون هناك خطأ
8. }
9. }

عند بدء تشغيل التطبيق (أي، يقوم شخص ما باستدعاء Java SomeClass من سطر الأوامر)، لا يوجد أي كائن من فئة SomeClass. ومع ذلك، هناك متغير i تمت تهيئته في السطر 2 وزيادته في السطر 6. وإذا قمنا بإلغاء التعليق على السطر السابع، فسنحصل بشكل عام على خطأ في الترجمة، لأن الطريقة الثابتة لا يمكنها استخدام متغيرات فئة غير ثابتة.

21 إجابة

إحدى القواعد الأساسية: اسأل نفسك: "هل من المنطقي استدعاء هذه الطريقة حتى لو لم يتم إنشاء Obj بعد؟" إذا كان الأمر كذلك، فإنه سيكون بالتأكيد ثابتا.

لذا، في فئة السيارة، يمكن أن يكون لديك طريقة double ConvertMpgToKpl(double mpg) والتي ستكون ثابتة لأنه يمكنك معرفة ما الذي يتحول إليه 35mpg حتى لو لم يقم أحد ببناء سيارة على الإطلاق. لكن مجموعة void setMileage(double mpg) (التي تحدد كفاءة سيارة معينة) لا يمكن أن تكون ثابتة، لأنه لا يمكن تصور استدعاء الطريقة قبل بناء أي سيارة.

(راجع للشغل، العكس ليس صحيحًا دائمًا: في بعض الأحيان يمكن أن يكون لديك طريقة تتضمن كائنين Car وما زلت تريد أن تكون ثابتة. على سبيل المثال Car theMoreEfficientOf(Car c1, Car c2). على الرغم من أنه يمكن تحويل ذلك إلى غير - ثابت الإصدار، يرى البعض أنه نظرًا لعدم وجود اختيار "متميز" لأي سيارة أكثر أهمية، فلا يجب أن تجبر المتصل على اختيار سيارة واحدة باعتبارها الكائن الذي ستشير إليه، وهو جزء صغير إلى حد ما من جميع الطرق الثابتة.)

حدد الأساليب الثابتة فقط في السيناريوهات التالية:

هناك عدة أسباب وجيهة لاستخدام الأساليب الثابتة:

    أداء: إذا كنت تريد تشغيل بعض التعليمات البرمجية ولا تريد إنشاء كائن إضافي للقيام بذلك، فضعها في طريقة ثابتة. يمكن لـ JVM أيضًا تحسين الأساليب الثابتة كثيرًا (أعتقد أنني قرأت ذات مرة أن جيمس جوسلينج يقول أنك لا تحتاج إلى تعليمات خاصة في JVM لأن الأساليب الثابتة ستكون بنفس السرعة، ولكن لا يمكنك العثور على المصدر - لذلك قد يكون هذا كاذبة تماما). نعم، هذا تحسين صغير وربما غير ضروري. ونحن المبرمجين لا نقوم أبدًا بأشياء غير ضرورية لمجرد أنها رائعة، أليس كذلك؟

    التطبيق العملي: بدلاً من استدعاء Util().method(arg) جديد، اتصل بـ Util.method(arg) أو الأسلوب(arg) مع استيراد ثابت. أسهل وأقصر.

    طرق الإضافة: لقد أردت حقًا أن تحتوي فئة String على طريقة مثيل RemoveSpecialChars()، ولكنها غير موجودة (ولا ينبغي لها ذلك، نظرًا لأن الأحرف الخاصة بمشروعك قد تكون مختلفة عن مشروع آخر)، ولا يمكنك إضافتها ( نظرًا لأن Java عادية تمامًا)، لذا يمكنك إنشاء فئة أداة مساعدة واستدعاء RemoveSpecialChars(s) بدلاً من s.removeSpecialChars() . حلو.

    نقاء: مع اتخاذ بعض الاحتياطات، ستكون طريقتك الثابتة وظيفة خالصة والشيء الوحيد الذي تعتمد عليه هو معلماتها. بيانات، بيانات. يعد هذا أسهل في القراءة والتصحيح نظرًا لأنه ليس لديك ميراث يدعو للقلق. يمكنك القيام بذلك باستخدام طرق المثيل أيضًا، لكن المترجم سيساعدك أكثر قليلاً باستخدام الطرق الثابتة (لا يسمح لك بالإشارة إلى سمات المثيل، أو طرق التجاوز، وما إلى ذلك).

ستحتاج أيضًا إلى إنشاء طريقة ثابتة إذا كنت تريد إنشاء مفردة، ولكن... لا تفعل ذلك. يعني فكر مرتين.

الآن، الأهم من ذلك، لماذا لا تريد إنشاء طريقة ثابتة؟ أساسًا، تعدد الأشكال يخرج من النافذة. لن تتمكن من تجاوز الطريقة، ولن تتمكن من الإعلان عنها في واجهة (ما قبل Java 8). وهذا يتطلب الكثير من المرونة من التصميم الخاص بك. أيضا، إذا كنت في حاجة ولاية، سوف تحصل على الكثير أخطاء التزامنو/أو الاختناقات إذا لم تكن حذرًا.

بعد قراءة مقالات ميسكو، أعتقد أن الأساليب الثابتة سيئة من منظور الاختبار. بدلاً من ذلك، يجب أن يكون لديك (ربما باستخدام أداة تداخل الحقن مثل Guice).

كيف يمكنني التأكد من أن لدي واحدة فقط

هناك مشكلة واحدة فقط وهي "كيف يمكنني التأكد من أن لدي مشكلة واحدة فقط تم التهرب منها" بشكل جيد. أنت فقط تقوم بإنشاء مثيل ApplicationFactory واحد في ملفك الرئيسي، ونتيجة لذلك، فإنك تقوم فقط بإنشاء مثيل كامل لمفرداتك.

المشكلة الرئيسية في الأساليب الثابتة هي التعليمات البرمجية الإجرائية

المشكلة الرئيسية في الأساليب الثابتة هي أنها عبارة عن تعليمات برمجية إجرائية. ليس لدي فكرة عن إجراء اختبار الوحدة. يفترض اختبار الوحدة أنه يمكنني إنشاء جزء من طلبي بشكل منفصل. أثناء الإنشاء، أقوم بتضمين التبعيات باستخدام الصور الوهمية/الصديقة التي تحل محل التبعيات الحقيقية. مع البرمجة الإجرائية، لا يوجد شيء يمكن "تأخيره" لأنه لا توجد كائنات، فالرمز والبيانات منفصلان.

الطريقة الثابتة هي أحد أنواع الطرق التي لا تتطلب تهيئة كائن لاستدعائه. هل لاحظت أنه يتم استخدام الثابت في الوظيفة الرئيسية في Java؟ يبدأ تنفيذ البرنامج من هناك دون إنشاء كائن.

خذ بعين الاعتبار المثال التالي:

لغات الفصل ( public static void main(String args) (display(); ) static void Display() ( System.out.println("Java هي لغة البرمجة المفضلة لدي."); ) )

الأساليب الثابتة في Java مخصصة لفئة معينة (وليست خاصة بمثيل). إنهم لا يستخدمون متغيرات الحالة وعادةً ما يأخذون المدخلات من المعلمات، وينفذون إجراءات عليها، ثم يعيدون بعض النتائج. ترتبط أساليب المثيل بالكائنات، وكما يوحي الاسم، يمكنها استخدام متغيرات المثيل.

إذا قمت بتطبيق كلمة أساسية ثابتة بأي طريقة، فإنها تُعرف باسم الطريقة الثابتة.

  • تشير الطريقة الثابتة إلى فئة، وليس كائنًا من فئة.
  • طريقة ثابتة يتم استدعاؤها دون الحاجة إلى إنشاء مثيل للفئة.
  • يمكن للطريقة الثابتة الوصول إلى عضو بيانات ثابت ويمكنها تغيير قيمته.

// برنامج لتغيير خاصية مشتركة لجميع الكائنات (حقل ثابت).

فئة Student9 (int rollno؛ اسم السلسلة؛ كلية سلسلة ثابتة = "ITS"؛ تغيير باطل ثابت ()) (college = "BBDIT"؛ ) Student9 (int r، String n) (rollno = r؛ name = n؛) void عرض ()(System.out.println(rollno+" "+name+" "+college);) public static void main(String args)( Student9.change(); Student9 s1 = new Student9 (111,"Indian"); Student9 s2 = new Student9 (222، "American")؛

O/P: 111 BBDIT هندي 222 BBDIT أمريكي 333 BBDIT صيني

لا يتم إنشاء مثيل للطرق الثابتة، لذا لا يمكنها الوصول إلى الحقول غير الثابتة في الفصل.

يمكنك استخدام طريقة ثابتة إذا كانت الطريقة لا تستخدم أي حقول (أو حقول ثابتة فقط) للفئة.

إذا تم استخدام حقول فئة غير ثابتة، فيجب عليك استخدام أسلوب غير ثابت.

في الواقع، نحن نستخدم الخصائص والأساليب الثابتة في الفصل الدراسي عندما نرغب في وجود جزء من برنامجنا هناك حتى يتم تشغيل برنامجنا. ونحن نعلم أنه لمعالجة الخصائص الثابتة نحتاج إلى أساليب ثابتة لأنها ليست جزءًا من متغير الحالة. وبدون الأساليب الثابتة، تستغرق إدارة الخصائص الثابتة الكثير من الوقت.

الأساليب والمتغيرات الثابتة هي الإصدار المُدار من الوظائف والمتغيرات "العالمية" في Java. ما هي الأساليب التي يمكن الوصول إليها مثل classname.methodName() أو classInstanceName.methodName() ، أي أنه يمكن الوصول إلى الأساليب الثابتة والمتغيرات باستخدام اسم الفئة بالإضافة إلى مثيلات الفئة.

لا يمكن الإعلان عن فئة على أنها ثابتة (لأن هذا غير منطقي. إذا تم الإعلان عن فئة عامة، فيمكن الوصول إليها من أي مكان)، ويمكن تعريف الفئات الداخلية بأنها ثابتة.

يمكن استخدام الأساليب الثابتة إذا

    لا حاجة لتنفيذ إجراء على المثيل (طرق الأداة المساعدة)

    كما ذكرنا في العديد من الإجابات المذكورة أعلاه في هذا المنشور، تحويل الأميال إلى كيلومترات أو حساب درجة الحرارة من فهرنهايت إلى مئوية والعكس. في هذه الأمثلة، باستخدام أسلوب ثابت، لا يلزم إنشاء كائن جديد بالكامل على ذاكرة الكومة. دعونا نلقي نظرة أدناه

    1. ABCClass جديد (فارنهايت مزدوج).convertFarenheitToCelcium() 2. ABCClass.convertFarenheitToCelcium(فارنهايت مزدوج)

    الأول ينشئ فئة جديدة لكل طريقة، الأداء، التدريب العملي. ومن الأمثلة على ذلك فئة الرياضيات وApache-Commons StringUtils أدناه:

    Math.random() Math.sqrt(مزدوج) Math.min(int, int) StringUtils.isEmpty(String) StringUtils.isBlank(String)
  • يريد المرء أن يستخدم كوظيفة بسيطة. يتم تمرير المدخلات بشكل صريح وتلقي بيانات النتائج كقيمة إرجاع. الميراث، لا يحدث تثبيت الكائن. موجزة وقابلة للقراءة.

ملحوظة: قليل من الناس يعترضون على اختبار الطرق الثابتة، ولكن يمكن اختبار الطرق الثابتة أيضًا! مع jMockit يمكنك الاستهزاء بالطرق الثابتة. قابلية الاختبار. المثال أدناه:

نموذج بالحجم الطبيعي الجديد () ( @Mock public int doSomething(Input input1, Input input2)( return returnValue; ) );

أتساءل متى يجب استخدام الأساليب الثابتة؟

  • إحدى الطرق الشائعة لاستخدام الأساليب الثابتة هي الوصول إلى الحقول الثابتة.
  • ولكن يمكن أن يكون لديك أساليب ثابتة دون الرجوع إلى المتغيرات الثابتة. يمكن العثور على أساليب مساعدة بدون مرجع متغير ثابت في بعض فئات Java مثل

    ثابت عام int min(int a, int b) (return (a<= b) ? a: b; }

    هناك طريقة أخرى يمكنني من خلالها التفكير في هذه الطرق مع الطريقة المتزامنة وهي تنفيذ قفل مستوى الفئة في بيئة متعددة الخيوط.

لنفترض أنه إذا كان لدي فصل يحتوي على عدة حروف ومحددات، فإن هناك طريقة أو اثنتين، وأريد أن تكون هذه الأساليب قابلة للاستدعاء فقط على كائن مثيل الفئة. هل هذا يعني أنني يجب أن أستخدم طريقة ثابتة؟

إعلان الأساليب.

الموضوع 9. الأساليب

كما ذكرنا سابقًا، تدعم لغة C# مجموعة كبيرة من وظائف الأعضاء التي لها أسماء مختلفة وتخدم أغراضًا مختلفة. ومع ذلك، تحتوي جميعها على كتل بيانات يتم تنفيذها عند استدعائها بنفس الطريقة تمامًا مثل الطريقة القياسية.

يمكن تقسيم الأساليب إلى مجموعتين رئيسيتين - طرق المثال(محدد بدون كلمة رئيسية ثابتة) التي تنتمي إلى مجموعة وظائف المثيل والأساليب الثابتة مع الكلمة الأساسية ثابتةوالتي تنتمي إلى مجموعة الوظائف الثابتة.

يتم تنفيذ طريقة المثيل على كائن معين، ويتم تنفيذ الطريقة الثابتة على فئة ما، لذلك عند استدعاء الأخير، يتم استخدام اسم الفئة، وليس الكائن، وتستخدم جميع الكائنات من نفس الفئة نسخة واحدة من المثيل طريقة.

يتكون تعريف الطريقة من رأس الطريقة ونص الطريقة. يحدد الرأس السمات المهمة التي تحدد كيفية وصول الأجزاء الأخرى من البرنامج إلى الطريقة. يتكون جسم الطريقة من العبارات التي يتم تنفيذها عند استدعائها.

يتم تحديد مستوى الوصول للطريقة من خلال مؤهل اختياري في رأسها.

في هذه المرحلة، تم استخدام اثنين من المحددات المحتملة: عامو خاص،يشير public إلى أنه يمكن الوصول إلى الطريقة بواسطة أي جزء من البرنامج، أ خاصيحد من استخدامه خارج الفصل الدراسي.

فيما يلي كتلة نحوية لتطبيق الطريقة.

الطريقة::=

<3аголовок_метода>

<Тело_метода>

<3аголовок_метода>::=[<Спецификаторы_метода>] <Тип_возвращаемого_значения> <Идентификатор метода> ([<Список_формальных_параметров>])

< Тело_метода>: :=

<Операторы>

<Спецификаторы_метода>

::=<Спецификатор_доступности>

<Спецификатор_доступности>

::= عام

::= خاص

<Тип_возвращаемого_значения>

::= <Тип>

يتكون استدعاء الأسلوب من اسمه متبوعًا بزوج من الأقواس التي تحتوي على قائمة من الوسائط، ويجب أن يتطابق الأخير مع قائمة المعلمات الرسمية المحددة في رأس الطريقة.

اعط مثالا.

من المعروف أن تنفيذ البرنامج في بيئة .NET يبدأ باستدعاء الطريقة Main(). لا يُنشئ وقت التشغيل أي كائنات، لذلك يجب استدعاء Main() بشكل مستقل عنها. يشير الإعلان عن الأسلوب Main() كأسلوب ثابت إلى أنه ينتمي إلى الفئة. وبالتالي، يستدعي وقت التشغيل Main() مباشرة من خلال اسم الفئة.

يمكن استدعاء الطريقة الثابتة بثلاث طرق:

1. من كائن الفئة التي ينتمي إليها. في هذه الحالة، ليست هناك حاجة للبادئة (اسم الفئة أو الكائن).

متوسط ​​الفراغ الثابت العام (...)



2. من خارج هذا الفصل.

هناك احتمالان:

1. إذا كان هناك كائن من الفئة حيث يتم تعريف الطريقة، فإن استدعاء الأخير يتكون من اسم الكائن والعملية المؤهلة واسم الطريقة:

myClass A = new myClass();

2. بغض النظر عن وجود كائنات الفئة التي تم تعريف الطريقة فيها، فإنه يتم استدعاء الفئة من خلال عملية التحسين:

MyClass.Average(...)...

عند استدعاء أسلوب ما، يفضل استخدام اسم الفئة (myClass.Average(...)) بدلاً من الكائن A.Average(...) لأن الخيار الأول يشير بوضوح إلى أنه يتم استدعاء أسلوب ثابت .



نواصل الموضوع:
شبابيك

الجزء الثاني: "أهم خصائص كل عائلة من معالجات Intel Core i3/i5/i7. أي من هذه الرقائق لها أهمية خاصة" المقدمة أولاً سنقدم...