إصلاح: لا يمكن الرجوع إلى الأسلوب غير الثابت من سياق ثابت

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

لا يمكن الرجوع إلى الأسلوب غير الثابت من سياق ثابت

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

ما هي الطريقة الساكنة؟

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

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

فيما يلي مثال قصير عن كيفية إجراء طريقة ثابتة لتغيير خاصية كل الكائنات.

 طلاب الصف {int roll_no؛ اسم السلسلة كلية السلسلة الثابتة = "InformationTech" ؛ تغيير الفراغ الثابت () {college = "Management"؛} الطلاب (int int ، string name_self) {roll_no = number؛ name = name_self؛} void display () {System.out.println (rollno + "" + name + "" + college)؛} main void static public (String args []) {Students.change () ؛ Students stu_1 = طلاب جدد (100 ، "Mexican") ؛ الطلاب stu_2 = طلاب جدد (202 ، "American") ؛ طلاب stu_3 = الطلاب الجدد (309 ، "البريطانيون") ؛ stu_1.display () ؛ stu_2.display () ؛ stu_3.display () ؛}} 

سيكون ناتج البرنامج:

 100 الإدارة المكسيكية 202 الإدارة الأمريكية 309 الإدارة البريطانية 

ما هو الفرق بين الفصل ومثيل الفصل؟

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

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

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

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

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

الآن ، سننظر في جميع الحالات المختلفة التي يمكن أن يحدث فيها الترميز الخاص بك بشكل صحيح ورؤية الحلول لإصلاحها.

المشكلة الأولى: أنت تتصل بشيء غير موجود

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

 java.util.List someMethod () {/ * Some Code * / return someList؛ } ثابت الفراغ الثابت العام (String [] strArgs) {// العبارة التالية تسبب الخطأ. أنت تعرف لماذا .. java.util.List someList = someMethod ()؛ } 

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

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

المشكلة 2: الطرق غير ثابتة

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

 الفئة العامة BookStoreApp2 {// الثوابت للخيارات إدخال الماسح = الماسح الضوئي الجديد (System.in) ؛ main statue void static (String [] args) {BookStoreItem [] item؛ // Declaring array item = new BookStoreItem [10]؛ // initializing array int itemType = -1؛ printMenu ()؛ getUserChoice ()؛ for (int i = 0؛ i <item.length؛ i ++) {} // end of statement statement} // end of for loop for (int i = 0؛ i <item.length؛ i ++) {} // end لـ} // نهاية الطريقة الرئيسية 

هنا في هذا الرمز ، تحتاج إلى تحويل كل من printMenu () و getUserChoice () إلى أساليب ثابتة.

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

 BookStoreApp2 () {// ضع محتويات الطريقة الرئيسية هنا} العامة بعد القيام بذلك ، قم بما يلي داخل طريقة main (): public void main (String [] args) {new BookStoreApp2 ()؛ } 

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

مقالات مثيرة للاهتمام