English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

هل يمكننا استخدام المرجع الديناميكي للفئات غير الثابتة في Java؟

سيكون لدي Java ثلاثة أنواع من المتغيرات، وهي متغيرات النموذج (النموذج)، والنموذج، والمحلية.

  • متغيرات محلية- تنتمي هذه المتغيرات إلى الطريقة/الفقرة/بناء النموذج وتُإعلان/تعريف فيها. تُحدد نطاق هذه المتغيرات داخل الطريقة (أو الفقرة أو بناء النموذج) وتُهدم عند التنفيذ.

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

    عليك استخدام النموذج للاستدلال على متغيرات النموذج. أي أن للاستدلال على متغيرات النموذج، تحتاج إلى إنشاء نموذج، وأن تستخدم هذا النموذج، تحتاج إلى الوصول إلى هذه المتغيرات.

  • متغيرات النموذج/الثابتة- متغيرات النموذج/الثابتة تنتمي إلى النموذج، مثل متغيرات النموذج، يتم إعلانها في أي مكان خارج أي طريقة في النموذج، ولكن باستخدام الكلمة المفتاحية static.

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

الاستدلال الثابت على المتغير غير الثابت e

كما هو موضح أعلاه، باستخدام استدلال الاسم (الوصول) إلى متغيرات النموذج.

System.out.println(MyClass.data);

باستخدام استدلال ثابت على المتغير يعني استخدام اسم النموذج.

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

لذلك، لا يمكنك في Java الاستدلال على الحقول غير الثابتة (المتغيرات) بشكل ثابت. إذا كنت تستمر في القيام بذلك، فحاول القيام بذلك، مما يؤدي إلى إصدار خطأ في وقت التجميع يخبرك بـ“لا يمكن الاستدلال على المتغير غير الثابت ‘الرياضيات’ من السياق الثابت”.

مثال

تبعًا لبرنامج Java، يقبل العلامة المستخدمة ويحدد ما إذا كان الترقية.

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

import java.util.Scanner;
public class StudentMarks {
   Scanner scan1 = new Scanner(System.in);
   private double math;
   private double science;
   private double english;
   public StudentMarks(double math, double science, double english) {
      this.math = math;
      this.science = science;
      this.english = english;
   }
   public static boolean wasPromroted(StudentMarks marks) {
      if(math>=85 && science>=75 && english>=65) {}}
         return true;
      }
      return false;
   }
   public static void main(String args[]) {
      Scanner sc = new Scanner(System.in);
      System.out.println("ادخل درجة الرياضيات الخاصة بك:");
      double math = sc.nextDouble();
      System.out.println("ادخل درجة العلمي الخاصة بك:");
      double science = sc.nextDouble();
      System.out.println("ادخل درجة اللغة الإنجليزية الخاصة بك:");
      double english = sc.nextDouble();
      StudentMarks marks = new StudentMarks(math, science, english);
      boolean bool = wasPromroted(marks);
      if(bool) {
         System.out.println("تهاني، تم ترقيتك");
      }
         System.out.println("آسف، حاول مجددا");
      }
   }
}

النتيجة الخارجة

StudentMarks.java:16: خطأ: لا يمكن الإشارة إلى المتغير غير الثابت math من سياق ثابت.
   if(math>=85 && science>=75 && english>=65)
^
StudentMarks.java:16: خطأ: لا يمكن الإشارة إلى المتغير غير الثابت science من سياق ثابت.
   if(math>=85 && science>=75 && english>=65)
^
StudentMarks.java:16: خطأ: لا يمكن الإشارة إلى المتغير غير الثابت english من سياق ثابت.
   if(math>=85 && science>=75 && english>=65)
^
3 أخطاء

حل

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

import java.util.Scanner;
public class StudentMarks {
   Scanner scan1 = new Scanner(System.in);
   private double math;
   private double science;
   private double english;
   public StudentMarks(double math, double science, double english) {
      this.math = math;
      this.science = science;
      this.english = english;
   }
   public static boolean wasPromroted(StudentMarks marks) {
      if(marks.math>=85 && marks.science>=75 && marks.english>=65)
      return true;
      return false;
   }
   public static void main(String args[]) {
      Scanner sc = new Scanner(System.in);
      System.out.println("ادخل درجة الرياضيات الخاصة بك:");
      double math = sc.nextDouble();
      System.out.println("ادخل درجة العلمي الخاصة بك:");
      double science = sc.nextDouble();
      System.out.println("ادخل درجة اللغة الإنجليزية الخاصة بك:");
      double english = sc.nextDouble();
      StudentMarks marks = new StudentMarks(math, science, english);
      boolean bool = wasPromroted(marks);
      if(bool) {
         System.out.println("تهاني، تم ترقيتك");
      }
         System.out.println("آسف، حاول مجددا");
      }
   }
}

النتيجة الخارجة

ادخل درجة الرياضيات الخاصة بك:
89
ادخل درجة العلمي الخاصة بك:
85
ادخل درجة اللغة الإنجليزية الخاصة بك:
86
تهاني، تم ترقيتك
مفضل لك