الكورس

Advertisements

Java Access Modifier Types


هناك نوعان من الـ access modifiers في Java:

  1. معدِّلات الوصول access modifiers
  2. معدِّلات عدم الوصول  non-access modifiers

 

تحدد الـ access modifiers في Java إمكانية الوصول لـ field أو method أو constructors أو class.

يمكننا تغيير مستوى للـ field أو method أو constructors أو class من خلال تطبيق الـ access modifier عليه.

 

مثال:

public class ClassName {
   
}

private boolean myTotal;
static final double price = 9.5;
protected static final int Height = 42;

public static void main(String[] arguments) {
  // body of method
}

Access modifier types

 

هناك أربعة أنواع من الـ access modifier فى Java:

  1. Default: مستوى الوصول للـ default modifier يكون داخل الحزمة (package) فقط ولا يمكن الوصول إليه من خارجها، إذا لم تحدد أي مستوى للوصول ، فسيكون هو المستوى الافتراضي.
  2. Public: مستوى الوصول للـ Public modifier في كل مكان، يمكن الوصول إليه من داخل أو خارج الـ class أو الـ package.
  3. Private: مستوى الوصول للـ private modifier من داخل الـ class فقط، ولا يمكن الوصول إليه من خارج الـ class.
  4. Protected: يقع مستوى الوصول للـ Protected modifier داخل أو خارج الـ package من خلال الـ child class.

 


 

أمثلة للتوضيح

 

1) Default

 

مستوى الوصول للـ default modifier يكون داخل الحزمة (package) فقط.

 

في هذا المثال ، قمنا بإنشاء حزمتين (test و  testing)، نحن ندخل إلى class الـ A من خارج مجموعتها ، لأن الـ class ليست public ، لذا لا يمكن الوصول إليها من خارج الـ package.

 

A.java:

package test;  

class A {  
  void sayHello(){
    System.out.println("Hello");
  }  
}

B.java

package testing;  
import test.*;  

class B {  
  public static void main(String args[]){  
   A my_obj = new A();
   my_obj.sayHello();
  }  
}  

2) Public

 

مستوى الوصول للـ Public modifier في كل مكان.

 

مثال بسيط شبيه بالمثال السابق الخاص بالـ Default:

A.java

package test;  

public class A {  
  public void sayHello(){
    System.out.println("Hello");
  }  
}  

B.java

package testing;  
import test.*;  
  
class B {  
  public static void main(String args[]){  
   A my_obj = new A();  
   my_obj.sayHello();
  }  
}  

3) Private

 

مستوى الوصول للـ private modifier من داخل الـ class فقط.

 

في هذا المثال ، أنشأنا فصلين بإسم واحد الـ class يحتوي على متغير بيانات private وmethod أيضًا private:

class X{  
  private int data = 40;  
  private void sayHello(){
    System.out.println("Hello Member!");
  }  
}  
  
public class Test {  
  
 public static void main(String args[]){  
   x my_obj = new x();  
   System.out.println(my_obj.data); // Compile Time Error  
   my_obj.sayHello(); // Compile Time Error  
   }  

}  

إذا جعلت أي class constructor خاصًا private، فلا يمكنك إنشاء مثيل لتلك الـ class من خارج الـ class:

class X {  
  private X(){ //private constructor

  }

  void sayHello(){
    System.out.println("Hello Member");
  }  
}

public class Simple {  
  public static void main(String args[]){  
    X my_obj = new X();//Compile Time Error  
  }  
}

4) Protected

 

مستوى الوصول للـ Protected modifier داخل أو خارج الـ package من خلال الـ child class.

 

يمكن تطبيق الـ protected access modifier على الـ variables و الـ method والـ  constructor، ولا يمكن تطبيقه على الـ class.

 

مثال للتوضيح:

 

في هذا المثال: قمنا بإنشاء حزمتي test و mytest، و class الـ test عام (public) ، لذلك يمكن الوصول إليه من خارج الـ package.

ولكن تم تعريف method الـ sayHello لهذه الـ package على أنها محمية (protected) ، لذلك يمكن الوصول إليها من خارج الـ class فقط عن طريق التوريث Inherits.

A.java

package test;

public class A {
    
    protected void sayHello(){
        System.out.println("Hello");
    }
    
}

B.java

package mytest;
import test.*;  
  
class B extends A {  

  public static void main(String args[]){  
   B my_obj = new B();  
   my_obj.sayHello();  
  }  
  
}  

Non-Access Modifiers types

 

توفر Java عددًا من Non-Access Modifiers لتحقيق العديد من الوظائف، وهم:

 

  1. final: هذا الـ Modifier لوضع اللمسات الأخيرة على تطبيقات الـ class و الـ methods و الـ variables.
  2. static: هذا الـ Modifier لإنشاء methods و variables للـ class.
  3. abstract: هذا الـ Modifier لإنشاء classes و methods مجردة.
  4. synchronized: يتحكم هذا الـ Modifier في وصول مؤشر الترابط إلى block أو method.

 


 

Final Modifier

 

Final Variables


يمكن تهيئة المتغير final بشكل صريح مرة واحدة فقط، لا يمكن مطلقًا إعادة تعيين متغير مُرجع تم الإعلان عنه نهائيًا للإشارة إلى كائن مختلف.

ومع ذلك ، يمكن تغيير البيانات الموجودة داخل الكائن.

مع المتغيرات ، غالبًا ما يتم استخدام الـ final modifier مع static لجعل الـ constant متغير class.

 

مثال:

public class Test {

    final int value = 10;
 
    // Declaring constants:
    public static final int BOXHEIGHT = 100;
    static final String TITLE = "Albashmoparmeg";
 
    public void changeValue() {
       value = 12;   // will give an error
    }
    
 }

Final Methods

 

لا يمكن لأي method فرعية تجاوز method الـ final.

 

مثال:

public class Test {
    public final void sayHello() {
       // body of method
    }
 }

Final Classes

 

الغرض الرئيسي من استخدام class يتم الإعلان عنه كـ final هو منع الـ class من التصنيف الفرعي.

إذا تم وضع علامة على الـ class على أنه final، فلا يمكن لأي class أن يرث أي ميزة من الـ class الأخير.

 

مثال:

public final class Test {
   // body of class
}

abstract Modifier

 

Abstract Class

 

لا يمكن أبدًا إنشاء class الـ abstract،إذا تم الإعلان عن class على أنه abstract، فإن الغرض الوحيد هو تمديد الـ class.

لا يمكن أن تكون class الـ abstract والـ final (حيث لا يمكن تمديد الـ class)، إذا كان الـ class يحتوي على abstract methods ، فيجب الإعلان عن abstract class، خلاف ذلك  سيتم طرح خطأ من الـ compiler.

 

مثال:

 abstract class user {
    private String name;
    private int age;
    public abstract void sayHello();   // an abstract method
 }

Abstract Methods

 

abstract method هي طريقة معلنة بدون أي تطبيق، يتم توفير جسم الـ methods بواسطة الـ class الفرعي، لا يمكن أن تكون methods الـ abstract نهائية(final) أو صارمة(strict).

إذا كانت الـ class تحتوي على method الـ abstract أو أكثر ، فيجب تعريف الـ class بأنها abstract.

💡 لا تحتاج الـ class الـ abstract إلى احتواء الـ methods الـ abstract|، وتنتهي method الـ abstract بفاصلة منقوطة.

 

مثال:

 public abstract class SuperClass {
    abstract void x();   // abstract method
 }
 
 class SubClass extends SuperClass {
    // implements the abstract method
    void x() {
      // .........
    }
 }

Synchronized Modifier

 

تستخدم الكلمة Synchronized للإشارة إلى أنه يمكن الوصول إلى الـ method من خلال مؤشر ترابط واحد فقط في كل مرة.

يمكن تطبيق synchronized modifier مع أي من modifiers مستوى الوصول الأربعة.

 

مثال:

 public synchronized void test() {
    
 }

Transient Modifier

 

يتم تمييز متغير transient للإشارة إلى JVM لتخطي المتغير المحدد عند إجراء تسلسل للكائن الذي يحتوي عليه.

يتم تضمين هذا transient في العبارة التي تنشئ المتغير ، الذي يسبق الـ class أو نوع البيانات للمتغير.

 

مثال:

 public transient int age = 40;
 public int x;  

Volatile Modifier

 

يتم استخدام الـ volatile modifier للسماح لـ JVM بمعرفة أن مؤشر الترابط الذي يصل إلى المتغير يجب أن يقوم دائمًا بدمج نسخته الخاصة من المتغير مع النسخة الرئيسية في الذاكرة.

يقوم الوصول إلى متغير بمزامنة جميع ذاكرة التخزين المؤقت التي تم نسخها من المتغيرات في الذاكرة الرئيسية.

 

مثال:

 public class users implements user {
    private volatile boolean active;
 
    public void run() {
       active = true;
       while (active) {  
          // some code here
       }
    }
 
    public void stop() {
       active = false;  
    }
 }



الإبلاغ عن خطأ

×

إذا وجد خطأ وتريد الإبلاغ عن هذا الخطأ، أو إذا كنت تريد تقديم اقتراح على شىء معين، فلا تتردد في إرسال بريد إلكتروني إلينا:

info@albashmoparmeg.com

شكرًا لك على مساعدتك لنا!

Advertisements