در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش جاوا (Java) قسمت 7 : Modifier ها

با سلام به همه دوستان و همراهان Itpro. در ادامه مباخث برنامه نویسی به زبان جاوا به بررسی Modifier ها در این زبان خواهیم پرداخت. Modifierها کلمات کلیدی هستند که برای تغییر معنی تعاریف استفاده می شوند. زبان جاوا Modifier های متفاوتی دارند که دو دسته مهم آنها عبارتند از:

  1. Modifierهای دسترسی
  2. Modifierهای غیردسترسی

برای استفاده از Modifier شما باید نام آن را قبل از تعریف کلاس و یامتد و یا متغیر خود بیاورید. در کد زیر نحوه استفاده از Modifier ها را نشان داده ایم.:

public class className {
   // ...
}
private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;
public static void main(String[] arguments) {
   // body of method
}

کلماتی مانند public , private, final عضو Modifierها هستند.

Modifierهای دسترسی

جاوا برای این که سطح دسترسی را مشخص کند از تعدادی Modifier دسترسی استفاده می کند. مشخص کردن سطح دسترسی می تواند در سطح کلاس یا متد یا متغیر باشد. چهار سطح دسترسی در جاوا عبارتند از:

  • قابل در دسترس در کل پکیج. این سطح دسترسی به طور پیشفرض برای همه ی مشخصه ها می باشد و اگر از هیچ modifier استفاده نشود این سطح دسترسی برای آن مشخصه در نظر گرفته می شود. یعنی در کل پکیج و همه کلاس های موجود در آن پکیج قابل دسترس است. برای مثال به کد زیر توجه نمایید
  • String version = "1.5.1";
    
    boolean processOrder() {
       return true;
    }
    
  • قابل دسترس در کلاس تعریف شده. این سطح دسترسی فقط در داخل کلاسی که مشخصه را تعریف کرده ایم قابل استفاده است و بیرون از آن قابل دسترسی نیست. برای این سطح دسترسی از private استفاده می شود. این سطح دسترسی محدود کننده ترین سطح دسترسی است. استفاده از دسترسی private راه کپسوله کردن و پنهان کردن اطلاعات کلاس از سایر کلاس ها است. برای مثال به کد زیر توجه نمایید
  • public class Logger {
       private String format;
       public String getFormat() {
          return this.format;
       }
       public void setFormat(String format) {
          this.format = format;
       }
    }
    

در کد بالا متغیر format به صورت private تعریف شده است بنابراین هیچ راهی برای کلاس های دیگر وجود ندارد که به طور مستقیم به این متغیر دسترسی داشته باشند. برای این که از سایر کلاس ها به این متغیر دسترسی داشته باشیم دو متد با نام های getFormat که مقدار کنونی متغیر را برمیگرداند و setFormat که مقدار متغیر را برابر با ورودی اش قرار می دهد تعریف کرده ایم. تعریف متد های get, set در جاوا بسیار رایج است و این متدها به getter,setter معروف هستند.

  • قابل استفاده در همه جا. برای این که همه جا حتی بیرون از پکیج هم مشخصه ما قابل دسترس باشد از این سطح دسترسی استفاده می کنیم. مثلا کلاسی نوشته ایم که می خواهیم در همه جای برنامه قابل استفاده باشد. برای این کار باید از این سطح دسترسی استفاده کنیم. برای مشخص کردن این سطح دسترسی از public استفاده می شود. در وراثت متدها و متغیر های public در کلاس فرزند نیز قابل استفاده می باشند. به عبارت دیگر جزئی از کلاس فرزند محسوب می شوند که از کلاس پدر به ارث رسیده اند. برای مثال به کد زیر دقت کنید:
  • public static void main(String[] arguments) {
       // ...
    }
    

تابع main در برنامه ها باید به صورت public باشد. اگر این تابع public نباشد برنامه قابلیت اجرا ندارد.

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

قوانین دسترسی در وراثت

قوانین زیر زمان وراثت کلاس ها باید رعایت شود

  1. متدهایی که در کلاس پدر به صورت public معرفی شده اند باید در کلاس فرزند هم به صورت public باشند.
  2. متدهایی که در کلاس پدر به صورت protected معرفی شده اند باید در کلاس فرزند به صورت protected و یا public باشند ولی نمی توانند به صورت private تعریف شوند.
  3. متدهایی که بدون Modifier دسترسی در کلاس پدر تعریف شده اند نمی توانند در کلاس فرزند به صورت private باشند.
  4. متدهایی که در کلاس پدر به صورت private تعریف شده اند قابل به ارث رسیدن نیستند و در کلاس فرزند اصلا قابل مشاهده و دسترسی نمی باشند.

Modifierهای غیردسترسی

در ادامه به معرفی تعدادی از Modifier های جاوا می پردازیم که ربطی به سطح دسترسی ندارند و هرکدام دارای معنی جداگانه ای می باشند. این Modifier ها در ادامه آمده اند:

  • استفاده از static. برای این که متدها و متغیرهایی بسازیم که بدون ساخت شی از کلاس قابل دسترس باشند و همچنین بین همه اشیا مشترک باشند از static استفاده می شود. به عبارت دیگر اگر یک متد را static تعریف کنیم. آن متد از طریق نام خود کلاس و بدون ساخت شی از آن کلاس قابل استفاده است. در تعریف متدهای static نمی توان از فیلدها و متغیرهای غیر static موجود در داخل کلاس استفاده کرد. برای مثال این Modifier به کد زیر دقت کنید:
  • public class InstanceCounter {
    
       private static int numInstances = 0;
    
       protected static int getCount() {
          return numInstances;
       }
    
       private static void addInstance() {
          numInstances++;
       }
    
       InstanceCounter() {
          InstanceCounter.addInstance(); 
       }
    
       public static void main(String[] arguments) {
          System.out.println("Starting with " +
          InstanceCounter.getCount() + " instances");
          for (int i = 0; i < 500; ++i){
             new InstanceCounter();
    	  }
          System.out.println("Created " +
          InstanceCounter.getCount() + " instances");
       }
    }
    

خروجی کد بالا به شکل زیر خواهد بود.

Started with 0 instances
Created 500 instances

دلیل این که شمارش اعداد به تعداد اشیا ساخته شده است این است که متغیر numInstances بین همه اشیا مشترک است زیرا که static تعریف شده است. همچنین به علت این که تابع addInstance به صورت static تعریف شده است می توان بدون داشتن شی به آن دسترسی داشت.

  • استفاده از final. این Modifier بسیار مهم است. اگر از این Modifier برای معرفی کلاس خود استفاده کنید این کلاس دیگر نمی تواند فرزند داشته باشد یعنی نمی توان از آن با استفاده از کلمه کلیدی extends کلاس فرزند ساخت. اگر از این Modifier در تعریف متد در کلاس پدر استفاده کنید در کلاس های فرزند نمی توانید این متد را به صورت سفارشی بازنویسی یا override کنید. اگر از این Modifier در تعریف متغیر استفاده کنید. فقط یک بار می توانید آن متغیر را مقدار دهی کنید. البته لازم نیست که زمان تعریف مقدار دهی کنیم. اما اگر یک بار مقداردهی کنیم دیگر قابل مقداردهی نیست. برای مثال به کد زیر دقت کنید:
  • public class Test{
      final int value = 10;
     
      public static final int BOXWIDTH = 6;
      static final String TITLE = "Manager";
      
      public void changeValue(){
         value = 12; //خطا ایجاد خواهد شد
      }
    }
    
  • استفاده از abstract. این Modifier زمانی استفاده می شود که بخواهیم کلاسی که میسازیم صرفا کلاس پدر باشد. یعنی فقط به این منظور این کلاس را می سازیم که بقیه کلاسها از آن وراثت داشته باشند. همچنین از کلاس های abstract نمی توان شی جدیدی با استفاده از new ساخت. یک کلاس نمی تواند هم final باشد هم abstract. اگر کلاسی دارای متد abstract باشد خود آن کلاس باید حتما به صورت abstract تعریف شده باشد. یک کلاس abstract می تواند هم متد معمولی داشته باشد و هم متد abstract داشته باشد. حال اگر از این Modifier برای متد استفاده کنیم. متد را پیاده سازی نمی کنیم. و فقط شکل معرفی متد را می نویسیم و در کلاس های فرزند آن را تعریف خواهیم کرد. دقت کنید که هنگامی که متد را abstract تعریف می کنیم باید بعد از تعریف از علامت سمی کالن استفاده کنیم. در کد زیر مثالی از تعریف کلاس و متد abstract آمده است.
  • public abstract class GraphicObject {
       // declare fields
       // declare nonabstract methods
       abstract void draw();
    }
    
  • کلمه کلیدی synchronized به این منظور مورد استفاده قرار می گیرد که مشخص کند که یک متد در یک زمان فقط توسط یک thread قابل دسترسی است. این Modifier می تواند با هر کدام از 4 Modifier دسترسی به کار برود. برای مثال به کد زیر دقت کنید:
  • public synchronized void showDetails(){
    .......
    }
    
  • از کلمه کلیدی transient بدین منظور استفاده می شود که به ماشین مجازی جاوا(JVM) بفهمانیم که هنگامی که محتویات شی را سریالیز می کند، متغیری که به صورت transient تعریف شده است را نادیده بگیرد. برای مثال به کد زیر دقت کنید.
  • public transient int limit = 55;   // will not persist
    public int b; // will persist
    
  • از volatile زمانی استفاده می کنیم که از چند thread در برنامه استفاده کنیم. منظور از استفاده از این Modifier این است که وقتی از این Modifier برای یک متغیر استفاده می کنیم به ماشین مجازی جاوا می گوییم که همه ی thread ها اگر متغیر مورد نظر را در حافظه کش خود تغییر بدهند باید آن تغییر بر روی متغیر در حافظه هم اعمال شود. دلیل این کار این است که اگر چند thread به صورت همزمان از یک متغیر استفاده می کنند مقدار متغیر داده قدیمی نداشته باشد و همیشه همگام پیش برویم. این Modifier فقط بر روی فیلدهای کلاس قابل استفاده است. یک متغیر volatile می تواند null باشد. برای مثال به کد زیر دقت کنید:
  • public class MyRunnable implements Runnable{
        private volatile boolean active;
     
        public void run(){
            active = true;
            while (active){ 
                // some code here
            }
        }
        
        public void stop(){
            active = false; 
        }
    }
    

اگر کد run را توسط یک thread اجرا کنیم و اگر متد stop را توسط یک thread دیگر اجرا کنیم ممکن است که در خط while(active) از متغیر active یک کپی در حافظه کش مربوط به thread اجرا کننده موجود باشد. بنابراین حتی اگر متد stop هم اجرا شود برنامه متوقف نمی شود. اما در این برنامه به دلیل این که متغیر active به صورت volatile معرفی شده است، اگر در متد stop مقدار این متغیر برابر False قرار بگیرد در همان زمان متد run هم متوقف خواهد شد.Itpro باشید

نویسنده: مهدی عادلی فر

منبع: جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

#آموزش_برنامه_نویسی_جاوا #final_در_جاوا #آموزش_جاوا #دسترسی_به_متغیرها_در_جاوا #آموزش_گام_به_گام_جاوا #private_و_public_در_جاوا #دوره_آموزشی_جاوا #abstract_در_جاوا #زبان_برنامه_نویسی_جاوا #یادگیری_زبان_برنامه_نویسی_جاوا
عنوان
1 آموزش جاوا (Java) قسمت 1 : معرفی ، خصوصیات و شروع به کار رایگان
2 آموزش جاوا (Java) قسمت 2 : شی گرایی قسمت یک رایگان
3 آموزش جاوا (Java) قسمت 3: شی گرایی قسمت دو رایگان
4 آموزش جاوا (Java) قسمت 4 : شی گرایی قسمت سه رایگان
5 آموزش جاوا (Java) قسمت 5 : انواع داده رایگان
6 آموزش جاوا (Java) قسمت 6 : انواع متغیر رایگان
7 آموزش جاوا (Java) قسمت 7 : Modifier ها رایگان
8 آموزش جاوا (Java) قسمت 8 : عملگرها قسمت یک رایگان
9 آموزش جاوا (Java) قسمت 9 : عملگرها قسمت دو رایگان
10 آموزش جاوا (Java) قسمت 10 : حلقه های تکرار رایگان
11 آموزش جاوا (Java) قسمت 11 : عبارات شرطی رایگان
12 آموزش جاوا (Java) قسمت 12 : کلاس Wrapper اعداد رایگان
13 آموزش جاوا (Java) قسمت 12 : کلاس Wrapper اعداد رایگان
14 آموزش جاوا (Java) قسمت 14: کلاس Wrapper کاراکترها رایگان
15 آموزش جاوا (Java) قسمت 15 : کلاس String و کار با رشته قسمت یک رایگان
16 آموزش جاوا (Java) قسمت 16 : کلاس String و کار با رشته قسمت دو رایگان
17 آموزش جاوا (Java) قسمت 17 : کلاس String و کار با رشته قسمت سه رایگان
18 آموزش جاوا (Java) قسمت 18 : کلاس String و کار با رشته قسمت چهار رایگان
19 آموزش جاوا (Java) قسمت 19 : StringBuilder و StringBuffer رایگان
20 آموزش جاوا (Java) قسمت 20 : استفاده از آرایه ها رایگان
21 آموزش جاوا (Java) قسمت 21 : آموزش کار با تاریخ رایگان
22 آموزش جاوا (Java) قسمت 22 : عبارات منظم (Regular Expression) رایگان
23 آموزش جاوا (Java) قسمت 23 : تعریف و استفاده از متدها قسمت یک رایگان
24 آموزش جاوا (Java) قسمت 24 : تعریف و استفاده از متدها قسمت دو رایگان
25 آموزش جاوا (Java) قسمت 25 : کار با استریم ها و فایل ها رایگان
26 آموزش جاوا (Java) قسمت 26 : کار با دایرکتوری ها رایگان
27 آموزش جاوا (Java) قسمت 27 : کلاس ByteArrayInputStream رایگان
28 آموزش جاوا (Java) قسمت 28 : معرفی کلاس File و متدها رایگان
29 آموزش جاوا (Java) قسمت 29 : معرفی و شرح Exception ها قسمت 1 رایگان
30 آموزش جاوا (Java) قسمت 30 : معرفی و شرح Exception ها قسمت 2 رایگان
31 آموزش جاوا (Java) قسمت 31 : معرفی و شرح Exception ها قسمت 3 رایگان
32 آموزش جاوا (Java) قسمت 32 : استفاده از انوع کلاس های داخلی رایگان
33 آموزش جاوا (Java) قسمت 33 : وراثت کلاس ها و انواع آن رایگان
34 آموزش جاوا (Java) قسمت 34 : Override کردن متد ها رایگان
35 آموزش جاوا (Java) قسمت 35 : چند ریختی (Polymorphism) رایگان
36 آموزش جاوا (Java) قسمت 36 : Enum و ویژگی های آن رایگان
37 آموزش جاوا (Java) قسمت 37 : معرفی Abstract رایگان
38 آموزش جاوا (Java) قسمت 38 : استفاده از کپسول بندی (Encapsulation) رایگان
39 آموزش جاوا (Java) قسمت 39 : استفاده از اینترفیس ها رایگان
40 آموزش جاوا (Java) قسمت 40 : پکیج(Package) و نحوه استفاده رایگان
41 آموزش جاوا (Java) قسمت 41 : معرفی داده ساختارها Enumeration رایگان
42 آموزش جاوا (Java) قسمت 42 : داده ساختار BitSet رایگان
43 آموزش جاوا (Java) قسمت 43 : داده ساختار Vector رایگان
44 آموزش جاوا (Java) قسمت 44 : داده ساختار Stack (پشته) رایگان
45 آموزش جاوا (Java) قسمت 45 : داده ساختار Dictionary رایگان
46 آموزش جاوا (Java) قسمت 46 : داده ساختار Hashtable رایگان
47 آموزش جاوا (Java) قسمت 47 : داده ساختار Properites رایگان
48 آموزش جاوا (Java) قسمت 48 : معرفی و آموزش جنریک (Generic) رایگان
49 آموزش جاوا (Java) قسمت 49 : برنامه نویسی سوکت و شبکه قسمت 1 رایگان
50 آموزش جاوا (Java) قسمت 50 : برنامه نویسی سوکت و شبکه قسمت 2 رایگان
51 آموزش جاوا (Java) قسمت 51 : استفاده از Lambda Expression رایگان
52 آموزش جاوا (Java) قسمت 52 : Thread و Multi-Threading رایگان
53 آموزش جاوا (Java) قسمت 53 : Runnable در Thread و Multi-Threading رایگان
54 آموزش جاوا (Java) قسمت 54 : کلاس Thread و متدها رایگان
زمان و قیمت کل 0″ 0
2 نظر
ali2121

با سلام

قسمت قوانین دسترسی در وراثت گزینه 3 به نظرم اشتباهه!

در واقع شما نمی تونید در کلاس فرزند متد ارث بری شده رو محدود تر کنید

البته شما استاد هستید احتمالا اشتباه تایپی بوده

مهدی عادلی فر

با تشکر از شما Itpro عزیز

اشکال مورد نظر تصحیح شد

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....