CodeGym /وبلاگ جاوا /Random-FA /محدوده جاوا
John Squirrels
مرحله
San Francisco

محدوده جاوا

در گروه منتشر شد
همه ما می دانیم که کشورها مرزها و قوانین خاص خود را دارند. قوانین کشور در داخل مرزها عمل می کند. همچنین در کشور، به عنوان مثال، سازمان هایی مانند مدارس یا موزه ها وجود دارند که قوانین محلی خود را دارند. آنها با قوانین کشور مغایرتی ندارند، بلکه فقط در چارچوب سازمان مشخص شده عمل می کنند. در برنامه نویسی هم همینطور است. بنابراین در برنامه نویسی و به ویژه در زبان جاوا اصطلاح "scope" وجود دارد. به مناطقی از برنامه اشاره دارد که در آن داده های خاصی مانند متغیرها یا روش ها کار می کنند. در این مقاله می‌خواهیم بفهمیم که چه محدوده‌ای برای متغیرها در جاوا وجود دارد و چگونه آنها را تعریف کنیم.

جاوا اسکوپ به طور کلی

چرا باید دامنه متغیرها و روش ها را از هم جدا کرد؟ واقعیت این است که گاهی اوقات برنامه ها بسیار بزرگ هستند و ردیابی یک یا آن متغیر ممکن است دشوار باشد. علاوه بر این، در پروژه های بزرگ، نامگذاری واضح متغیرها مطلوب است تا مشخص شود که آنها برای چه کاری هستند. Scope به طور خاص به شما این امکان را می دهد که متغیرهای مختلفی با نام یکسان در قسمت های مختلف برنامه داشته باشید. نگهداری و خواندن چنین کدی آسان تر است. محدوده جاوا مشخص می کند که در یک برنامه یک متغیر یا روش در دسترس است. به طور خلاصه:
  • متغیر اعلام شده در یک متد از ابتدای اعلان تا انتهای متد قابل مشاهده است (محدوده روش).
  • یک متغیر اعلام شده در یک بلوک کد تا پایان آن بلوک کد وجود دارد.
  • متغیرهایی که آرگومان های متد هستند تا پایان متد وجود دارند.
  • متغیرهای کلاس/شیء برای طول عمر شی حاوی وجود دارند. دید آنها توسط اصلاح کننده های دسترسی ویژه تنظیم می شود.
  • متغیرهای کلاس استاتیک در تمام مدتی که برنامه در حال اجرا است وجود دارند. دید آنها نیز توسط اصلاح کننده های دسترسی تعیین می شود.

محدوده سطح روش

هر متغیری که در یک متد اعلام شده است، از جمله آرگومان ها، خارج از آن متد قابل دسترسی نیست. تمامی متغیرهای اعلام شده در داخل متدها از ابتدای اعلان تا انتهای متد قابل مشاهده هستند. در اینجا یک مثال از محدوده متغیر متد آورده شده است:
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 در متد main.

محدوده سطح کلاس

محدوده سطح کلاس (متغیرهای نمونه) - هر متغیری که در یک کلاس اعلام شده برای همه متدهای آن کلاس در دسترس است. بسته به تغییر دهنده دسترسی آن (یعنی عمومی یا خصوصی)، گاهی اوقات می توان خارج از کلاس به آن دسترسی داشت. بنابراین اگر یک متغیر یک متغیر کلاس باشد، پس به یک شیء خاص محدود می شود و تا زمانی که یک شی از این کلاس وجود دارد وجود دارد. اگر شی وجود نداشته باشد، هیچ کپی از متغیر وجود ندارد. متغیر از همه متدهای کلاس قابل مشاهده است، صرف نظر از اینکه قبل یا بعد از آن اعلان شده باشند. هر شیء متغیر خود را مستقل از سایر اشیاء دارد. دسترسی به یک متغیر از روش های استاتیک امکان پذیر نیست.

نمونه کد

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));
   }
}
نام خانوادگی ، نام ، secondName و تولد متغیرهای نمونه هستند.

Block Scope

اگر متغیری در یک بلوک کد تعریف/اعلان شده باشد، آنگاه تا پایان آن بلوک کد وجود دارد. به طور معمول، چنین متغیرهایی بین بریس های فرفری که در آنها تعریف شده اند وجود دارند. اغلب محدوده بلوک می تواند یک متغیر حلقه باشد. متغیری که در یک شرط حلقه 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);
   }

}
برای استفاده از متغیر static today نباید یک نمونه جدید از کلاس Student ایجاد کنید . در اینجا "2022" چاپ خواهد شد.

اصلاح کننده های دسترسی

جاوا دارای 4 تغییر دهنده دسترسی برای محدود کردن دسترسی به متد یا متغیر است. شما می توانید آنها را در داخل کلاس ها استفاده کنید، نه درون متدها.
  • private محدود کننده ترین اصلاح کننده است. دسترسی به متدها و متغیرها را به کلاسی که اعلام شده اند محدود می کند. اگر نیازی به استفاده از متدها یا متغیرهای خاصی در خارج از کلاس نیست، از private استفاده کنید. متغیرهای کلاس معمولاً در جاوا خصوصی هستند.

  • اگر اصلاح کننده دسترسی مشخص نشده باشد، متد یا متغیر اصلاح کننده پیش فرض را می پذیرد . به طور پیش فرض اجازه دسترسی فقط از بسته فعلی را می دهد.

  • اصلاح‌کننده محافظت شده امکان دسترسی به یک متد یا متغیر را فقط از داخل بسته فعلی می‌دهد، مگر اینکه از طریق یک کلاس فرزند خارج از بسته قابل دسترسی باشد.

  • public کمترین محدود کننده ترین اصلاح کننده است. این به شما اجازه می دهد تا به یک کلاس، متد یا متغیر نه تنها از کلاسی که اعلام شده است، بلکه از خارج نیز دسترسی داشته باشید. این اصلاح کننده واقعاً اغلب استفاده می شود.

نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION