نعلم جميعًا أن الدول لها حدود وقوانينها الخاصة. قوانين الدولة تعمل داخل الحدود. يوجد أيضًا في الدولة، على سبيل المثال، منظمات، مثل المدارس أو المتاحف، التي لها قواعدها المحلية الخاصة. وهي لا تتعارض مع قوانين البلد، ولكنها تعمل فقط في إطار المنظمة المحددة. وينطبق الشيء نفسه في البرمجة. لذلك في البرمجة، وخاصة في لغة جافا، هناك مصطلح "النطاق". ويشير إلى مناطق البرنامج التي تعمل فيها بيانات معينة، مثل المتغيرات أو الأساليب. في هذه المقالة، سنتعرف على النطاقات المخصصة للمتغيرات في Java وكيفية تعريفها.
نطاق جافا بشكل عام
لماذا من الضروري فصل نطاقات المتغيرات والأساليب؟ والحقيقة هي أنه في بعض الأحيان تكون البرامج كبيرة جدًا وقد يكون من الصعب تتبع متغير أو آخر. بالإضافة إلى ذلك، في المشاريع الكبيرة، من المستحسن تسمية المتغيرات بشكل واضح بحيث يكون الهدف منها واضحًا. يتيح لك النطاق على وجه التحديد وجود متغيرات مختلفة بنفس الاسم في أجزاء مختلفة من البرنامج. مثل هذا الرمز أسهل في الصيانة والقراءة. يحدد نطاق Java مكان الوصول إلى متغير أو طريقة معينة في البرنامج. باختصار:- يكون المتغير المعلن في الطريقة مرئيًا من بداية التصريح إلى نهاية الطريقة (نطاق الطريقة).
- المتغير المعلن في كتلة التعليمات البرمجية موجود حتى نهاية كتلة التعليمات البرمجية تلك.
- المتغيرات التي تمثل وسيطات الطريقة موجودة حتى نهاية الطريقة.
- توجد متغيرات الفئة/الكائن طوال عمر الكائن المحتوي. يتم تنظيم ظهورهم بواسطة معدّلات وصول خاصة.
- توجد متغيرات الفئة الثابتة طوال وقت تشغيل البرنامج. ويتم تحديد إمكانية رؤيتها أيضًا من خلال معدّلات الوصول.
نطاق مستوى الطريقة
لا يمكن الوصول إلى أي متغير تم الإعلان عنه في إحدى الطرق، بما في ذلك الوسائط، خارج تلك الطريقة. جميع المتغيرات المعلنة داخل الطرق تكون مرئية من بداية إعلانها إلى نهاية الطريقة. فيما يلي مثال على نطاق متغير الطريقة:public class JScopeTest1 {
public static void main(String[] args) {
System.out.println(myMethod(5));
System.out.println(myMethod(17));
}
public static int myMethod(int arg) {
int secondArg = 100; //local method variable
return secondArg + arg;
}
}
لدينا هنا SecondArg ، وهو متغير محلي أو وسيطة أسلوب. لا يمكننا استخدام هذا المتغير خارج طريقة myMethod أو قبل الإعلان عنه. إذا كان المتغير عبارة عن وسيطة دالة، فسيكون مرئيًا في نص هذه الطريقة بالكامل. في المثال أعلاه لدينا وسيطتان من هذا القبيل: arg في myMethod وargs في الطريقة الرئيسية.
نطاق مستوى الفصل
نطاق مستوى الفئة (متغيرات المثيل) - أي متغير تم الإعلان عنه في فئة ما متاح لجميع أساليب تلك الفئة. اعتمادًا على معدل الوصول الخاص به (أي عام أو خاص)، يمكن أحيانًا الوصول إليه خارج الفصل الدراسي. لذا، إذا كان المتغير متغير فئة، فهو مرتبط بكائن معين ويظل موجودًا طالما يوجد كائن من هذه الفئة. إذا لم يكن هناك كائن، فلا توجد نسخة من المتغير. يكون المتغير مرئيًا من كافة أساليب الفئة، بغض النظر عما إذا تم الإعلان عنها قبله أو بعده. كل كائن له متغير خاص به مستقل عن الكائنات الأخرى. الوصول إلى متغير من الأساليب الثابتة غير ممكن.مثال على الكود
public class Student {
//class level variables
public String surname;
String name;
String secondName;
private Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases
public Student(String surname, String name, String secondName, Date birthday ){
this.surname = surname;
this.name = name;
this.secondName = secondName;
this.birthday = birthday == null ? 0 : birthday.getTime();
}
@Override
public int hashCode(){
//TODO: check for nulls
//return surname.hashCode() ^ name.hashCode() ^ secondName.hashCode() ^ (birthday.hashCode());
return (surname + name + secondName + birthday).hashCode();
}
@Override
public boolean equals(Object other_) {
Student other = (Student)other_;
return (surname == null || surname.equals(other.surname) )
&& (name == null || name.equals(other.name))
&& (secondName == null || secondName.equals(other.secondName))
&& (birthday == null || birthday.equals(other.birthday));
}
}
اللقب والاسم والاسم الثاني وتاريخ الميلاد هي متغيرات المثيل .
نطاق الكتلة
إذا تم تعريف/الإعلان عن متغير في كتلة ما من التعليمات البرمجية، فهو موجود حتى نهاية تلك الكتلة من التعليمات البرمجية. عادة، توجد مثل هذه المتغيرات بين الأقواس المتعرجة التي تم تعريفها فيها. في كثير من الأحيان، يمكن أن يكون نطاق الكتلة متغيرًا للحلقة. لا يمكن الوصول إلى المتغير الذي تم الإعلان عنه في حالة الحلقة for خارج الحلقة، إلا إذا قمت بتعريفه مسبقًا.public class JScopeTest2 {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
int sum = 0;
sum = sum + i;
}
int sum = 1;
System.out.println(sum);
}
}
يتم الإعلان عن متغيري sum وi الأول داخل الحلقة ولا يوجدان خارج هذه الحلقة. ومع ذلك، تم الإعلان عن المجموع الثاني خارج الحلقة، لذلك سيتم طباعة هذا المتغير المحدد.
المتغيرات الساكنة
إذا تم الإعلان عن متغير على أنه ثابت (مميز بالكلمة الأساسية الثابتة)، فهو موجود طالما أن فئته موجودة. عادة، يقوم JVM بتحميل فئة في الذاكرة عند الاستخدام الأول، عند تهيئة المتغيرات الثابتة.import java.util.Date;
public class Student {
public static int today = 2022;
String surname;
String name;
String secondName;
Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases
public Student(String surname, String name, String secondName, Date birthday ){
this.surname = surname;
this.name = name;
this.secondName = secondName;
this.birthday = birthday == null ? 0 : birthday.getTime();
}
public static void main(String[] args) {
System.out.println(today);
}
}
لا يجب عليك إنشاء مثيل جديد لفئة الطالب لاستخدام المتغير اليوم الثابت . هنا سيتم طباعة "2022".
معدّلات الوصول
تحتوي Java على 4 معدلات وصول لتقييد الوصول إلى الطريقة أو المتغير. يمكنك استخدامها داخل الفصول، وليس داخل الأساليب.-
الخاص هو المعدل الأكثر تقييدًا. إنه يقيد الوصول إلى الأساليب والمتغيرات إلى الفئة التي تم الإعلان عنها. إذا لم تكن هناك حاجة لاستخدام أساليب أو متغيرات معينة خارج الفصل، فاستخدم القطاع الخاص. عادة ما تكون متغيرات الفئة خاصة في Java.
-
إذا لم يتم تحديد أي معدّل وصول، فسيقبل الأسلوب أو المتغير المعدل الافتراضي . الافتراضي يسمح بالوصول فقط من الحزمة الحالية.
-
يسمح المعدل المحمي بالوصول إلى أسلوب أو متغير فقط من داخل الحزمة الحالية، ما لم يتم الوصول إليه من خلال فئة فرعية خارج الحزمة.
-
public هو المعدل الأقل تقييدًا. فهو يسمح لك بالوصول إلى فئة أو طريقة أو متغير ليس فقط من الفئة التي تم الإعلان عنها، ولكن أيضًا من الخارج. يتم استخدام هذا المعدل في كثير من الأحيان.
GO TO FULL VERSION