معرفی
این مقاله یکی از مفاهیم OOP، Access Modifiers در جاوا را به همراه چند مثال اساسی توضیح می دهد تا درک واضحی از مفهوم داشته باشید.
دسترسی به اصلاح کننده ها
اصلاح کننده های دسترسی کلمات کلیدی هستند که دسترسی مجاز به کلاس ها، متدها، سازنده، اعضای داده و غیره را مشخص می کنند. به عبارت دیگر، یک کلاس می تواند کنترل کند که چه اطلاعات یا داده هایی می تواند توسط کلاس های دیگر در دسترس باشد.
در جاوا، تعدیلکنندههای دسترسی متعددی برای تنظیم سطوح مورد نظر از کلاسها و همچنین فیلدها، متدها و سازندههای کلاسهای شما وجود دارد. یک عضو دارای بسته یا قابلیت دسترسی پیشفرض زمانی است که هیچ اصلاحکننده دسترسی مشخص نشده باشد. هر زمان که با کپسوله سازی در جاوا سروکار دارید، احتمالاً باید سطوح دسترسی را به حداقل برسانید.
اساساً دو نوع اصلاح کننده در جاوا وجود دارد:
- اصلاح کننده های دسترسی
- اصلاح کننده های غیر دسترسی
![اصلاح کننده ها در جاوا](https://www.c-sharpcorner.com/UploadFile/9a9e6f/access-modifiers-in-java99/Images/modifiers in Java.jpg)
اصلاح کننده های بدون دسترسی
اینها همگام، بومی، ایستا، انتزاعی، فرار، گذرا و غیره هستند. اما، در اینجا ما فقط اصلاح کننده های دسترسی را مورد بحث قرار می دهیم.
چهار سطح اصلاح کننده دسترسی به شرح زیر است:
- قابل مشاهده برای بسته، پیش فرض (بدون نیاز به تغییر دهنده)
- قابل مشاهده فقط برای کلاس (خصوصی)
- قابل مشاهده برای جهان (عمومی)
- قابل مشاهده برای بسته و همه زیر کلاسها (محافظت شده)
چهار نوع اصلاح کننده دسترسی به شرح زیر است:
- پیش فرض
- خصوصی
- عمومی
- حفاظت شده
![اصلاح کننده های دسترسی](https://www.c-sharpcorner.com/UploadFile/9a9e6f/access-modifiers-in-java99/Images/access modifiers.jpg)
اصلاح کننده های دسترسی پیش فرض
در جاوا، زمانی که هیچ تغییر دهنده دسترسی استفاده نمی شود، آن را یک مشخص کننده پیش فرض می نامند. هر کلاس، فیلد، متد یا سازندهای که اصلاحکننده دسترسی را اعلام نکرده باشد، فقط توسط کلاسهای همان بسته قابل دسترسی است. اصلاح کننده پیش فرض برای فیلدها و متدها در یک رابط استفاده نمی شود.
به عبارت دیگر، اگر از هیچ اصلاح کننده ای استفاده نکنید، به طور پیش فرض به عنوان پیش فرض در نظر گرفته می شود. اصلاح کننده پیش فرض فقط در داخل بسته قابل دسترسی است.
در اینجا ما در حال ساخت دو بسته مختلف هستیم. یکی یک مقاله و دیگری یک بسته پیش فرض است. در هر بسته یک کلاس Main.java و Greet.java ساخته ایم. هنگام تلاش برای دسترسی به کلاس Greet، از خارج از بسته آن، (و چون کلاس Greet عمومی نیست)، نمی توان از خارج از بسته آن به آن دسترسی داشت.
سلام. جاوا
- package article;
- public class Greet {
- void msg() {
- System.out.println("Hello..!! How are you..??");
- }
- }
Main.java
- package defaultpackage;
- import article.*;
- public class Main {
- public static void main(String[] args) {
- Main m = new Main();
- m.msg();
- }
- }
در مثال قبل، محدوده کلاس Greet و متد msg() پیشفرض است، بنابراین از خارج از بسته قابل دسترسی نیست.
اگر هر دو کلاس در یک بسته قرار گرفته باشند، مثال قبلی می تواند خروجی را به درستی ارائه دهد.
اصلاح کننده های دسترسی خصوصی
فیلدها یا متدهایی که به عنوان خصوصی اعلان می شوند محدودترین هستند را نمی توان برای کلاس ها و رابط ها استفاده کرد. فیلدها، متدها یا سازندههایی که بهعنوان خصوصی اعلام شدهاند، به شدت کنترل میشوند، به این معنی که هیچ کجا خارج از کلاس محصور نمیتوانند به آنها دسترسی داشته باشند. یک استراتژی طراحی استاندارد این است که همه زمینه ها خصوصی شوند و روش های دریافت کننده عمومی برای آنها ارائه شود.
به عبارت دیگر، اگر متد یا متغیری بهعنوان خصوصی علامتگذاری شود، تنها کدهای داخل همان کلاس میتوانند به متغیر دسترسی داشته باشند یا متد را فراخوانی کنند. کد داخل زیر کلاسها، نمیتواند به متغیر یا متد دسترسی داشته باشد، و همچنین نمیتواند از هیچ کلاس خارجی کدنویسی کند.
اگر یک کلاس به عنوان خصوصی علامت گذاری شود، هیچ کلاس خارجی نمی تواند به کلاس دسترسی داشته باشد. اگرچه این واقعاً برای کلاس ها منطقی نیست. بنابراین، اصلاح کننده دسترسی خصوصی بیشتر برای فیلدها، سازنده ها و متدها استفاده می شود.
مثال
در این مثال دو کلاس House و Details ایجاد کرده ایم. Class House شامل یک روش خصوصی و اعضای داده خصوصی است. هنگامی که سعی می کنیم به این اعضا و متدهای خصوصی دسترسی داشته باشیم، از خارج از کلاسی که دسترسی به آن امکان پذیر نیست، با خطای زمان کامپایل مواجه می شویم.
- class House {
- private int HNo = 211;
- private String Town = "Nagra";
- private String city = "Jhansi";
- private void show() {
- System.out.println("Welcome to my house");
- }
- }
- public class Details {
- public static void main(String args[]) {
- House h = new House();
- System.out.println(h.HNo);
- System.out.println(h.Town);
- System.out.println(h.city);
- h.show();
- }
- }
اگر سازنده کلاس را خصوصی کنید، نمی توانید نمونه ای از آن کلاس را از خارج از کلاس ایجاد کنید.
یک کلاس نمی تواند خصوصی یا محافظت شده باشد، به جز یک کلاس تودرتو.
اصلاح کننده های دسترسی عمومی
کلمه کلیدی عمومی نیز به دلیل ماهیتش ساده ترین تغییر دهنده دسترسی جاوا است. متغیر یا متدی که به عنوان public اعلام می شود به این معنی است که هر کلاسی می تواند به آن دسترسی داشته باشد. این برای آن دسته از متغیرهایی که باید برای کل برنامه شما قابل دسترسی باشد مفید است. معمولاً روال ها و متغیرهای مشترکی که باید در همه جا به اشتراک گذاشته شوند، عمومی اعلام می شوند.
به عبارت دیگر، فیلدها، متدها و سازنده های اعلام شده عمومی، که کمترین محدودیت را در یک کلاس عمومی دارند، برای هر کلاسی در برنامه جاوا قابل مشاهده هستند. صرف نظر از اینکه این کلاس ها در یک بسته هستند یا در بسته دیگری.
یک کلاس، متد، سازنده، اینترفیس و غیره اعلام شده به عنوان عمومی از هر کلاس دیگری قابل دسترسی است. بنابراین، فیلدها، متدها و بلوکهای اعلام شده در یک کلاس عمومی، از هر کلاس متعلق به جهان جاوا قابل دسترسی هستند.
با این حال، اگر کلاس عمومی که میخواهیم به آن دسترسی پیدا کنیم، در بسته دیگری باشد، کلاس عمومی باید وارد شود.