logo

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

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

الطريقة الثابتة

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

طريقة غير ثابتة

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

لنقم بإنشاء برنامج Java ونقوم بإنشاء نفس الخطأ.

مخطط uml جافا

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

StaticExample1.java

 public class StaticExample { private int number=0; public static void main(String args[]){ number++; System.out.println(number); } } 

انتاج:

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

الآن دعونا نعلن عن المتغير رقم كثابت وتجميع التعليمات البرمجية. لاحظ أن المتغير والطريقة الرئيسية () كلاهما ثابت.

StaticExample2.java

 class staticExample { private static int number=0; public static void main(String args[]){ number++; System.out.println(number); } } 

انتاج:

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

يتم تجميع البرنامج وتشغيله بنجاح.

بيثون نوع الصفوف

كل مثيل لمتغير غير ثابت له قيمة مختلفة ويتم إنشاؤه عندما يقوم عامل التشغيل new() بتهيئة مثيل لكائن ما. يتم إنشاء المتغيرات الثابتة أو تهيئتها عند تحميل الفصل JVM .

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

StaticExample3.java

 class variable { int number; public static void increment() { number++; } } class StaticExample { public static void main(String args[]) { variable var1 = new variable(); variable var2 = new variable(); variable var3 = new variable(); var1.number = 12; var2.number = 13; var3.number = 14; variable.increment(); System.out.println(var1.number); System.out.println(var2.number); System.out.println(var3.number); } } 

انتاج:

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

في البرنامج أعلاه، ثلاثة كائنات، فار1، فار2، فار3 ، تم إنشاؤها للفئة عامل وقمنا بتعيين القيم الثلاث المختلفة 12، 13، 14 للكائنات فار1، فار2 ، و فار3 ، على التوالى. الآن، رقم خاصية كل كائن لها قيمة عددية خاصة بها. عندما نحاول زيادة قيمة خاصية الرقم عن طريق استدعاء طريقة الزيادة ()، لا يفهم المترجم قيمة الرقم التي يجب أن تزيد الطريقة القيمة. يواجه المترجم خطأ الغموض ويلقي خطأ وقت الترجمة لا يمكن الرجوع إلى متغير غير ثابت من سياق ثابت .

الحل للخطأ

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

برمجة int c غير الموقعة

StaticExample4.java

 class staticExample { int number = 0; public static void main(String args[]) { // using non-static variable by creating an object of the class staticExample test = new staticExample(); test.number++; System.out.println(test.number);a } } 

انتاج:

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

وصف

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