logo

معدّلات الوصول في Java

  1. معدّل الوصول الخاص
  2. دور المنشئ الخاص
  3. معدّل الوصول الافتراضي
  4. معدل الوصول المحمي
  5. معدّل الوصول العام
  6. معدّل الوصول مع تجاوز الطريقة

هناك نوعان من المعدلات في Java: معدّلات الوصول و معدّلات عدم الوصول .

تحدد معدّلات الوصول في Java إمكانية الوصول أو نطاق الحقل أو الطريقة أو المنشئ أو الفئة. يمكننا تغيير مستوى الوصول للحقول والمنشئات والأساليب والفئات من خلال تطبيق معدل الوصول عليه.

هناك أربعة أنواع من معدّلات الوصول إلى Java:

    خاص: مستوى الوصول للمعدل الخاص موجود فقط داخل الفصل. ولا يمكن الوصول إليه من خارج الفصل.تقصير: مستوى الوصول للمعدِّل الافتراضي موجود فقط داخل الحزمة. ولا يمكن الوصول إليه من خارج الحزمة. إذا لم تحدد أي مستوى وصول، فسيكون هو المستوى الافتراضي.محمي: مستوى الوصول للمعدل المحمي موجود داخل الحزمة وخارج الحزمة من خلال فئة فرعية. إذا لم تقم بإنشاء فئة فرعية، فلا يمكن الوصول إليها من خارج الحزمة.عام: مستوى الوصول للمعدِّل العام موجود في كل مكان. يمكن الوصول إليه من داخل الفصل، خارج الفصل، داخل الحزمة وخارج الحزمة.

هناك العديد من المعدلات التي لا يمكن الوصول إليها، مثل المعدلات الثابتة، والمجردة، والمتزامنة، والمحلية، والمتقلبة، والعابرة، وما إلى ذلك. هنا، سنتعلم معدلات الوصول فقط.


فهم معدّلات الوصول إلى Java

دعونا نفهم معدّلات الوصول في Java من خلال جدول بسيط.

الوصول الى المعدلداخل الفصلضمن الحزمةالحزمة الخارجية حسب الفئة الفرعية فقطالحزمة الخارجية
خاص وننن
تقصير وونن
محمي ووون
عام وووو

1) خاص

لا يمكن الوصول إلى مُعدِّل الوصول الخاص إلا داخل الفصل الدراسي.

مثال على نظام التشغيل مفتوح المصدر هو

مثال بسيط لمعدل الوصول الخاص

في هذا المثال، قمنا بإنشاء فئتين A وSimple. يحتوي الفصل على عضو بيانات خاص وطريقة خاصة. نحن نصل إلى هؤلاء الأعضاء الخاصين من خارج الفصل، لذلك يوجد خطأ في وقت الترجمة.

 class A{ private int data=40; private void msg(){System.out.println('Hello java');} } public class Simple{ public static void main(String args[]){ A obj=new A(); System.out.println(obj.data);//Compile Time Error obj.msg();//Compile Time Error } } 

دور المنشئ الخاص

إذا قمت بجعل أي مُنشئ فئة خاصًا، فلن تتمكن من إنشاء مثيل لتلك الفئة من خارج الفئة. على سبيل المثال:

 class A{ private A(){}//private constructor void msg(){System.out.println('Hello java');} } public class Simple{ public static void main(String args[]){ A obj=new A();//Compile Time Error } } 

ملاحظة: لا يمكن أن تكون الفئة خاصة أو محمية باستثناء الفئة المتداخلة.


2) الافتراضي

إذا لم تستخدم أي معدّل، فسيتم التعامل معه على أنه تقصير بشكل افتراضي. لا يمكن الوصول إلى المُعدِّل الافتراضي إلا داخل الحزمة. ولا يمكن الوصول إليه من خارج الحزمة. ويوفر إمكانية الوصول أكثر من القطاع الخاص. لكنها أكثر تقييدًا من كونها محمية وعامة.

مضيف لينكس

مثال على معدّل الوصول الافتراضي

في هذا المثال، قمنا بإنشاء حزمتين: pack وmypack. نحن نصل إلى الفئة A من خارج الحزمة الخاصة بها، نظرًا لأن الفئة A ليست عامة، لذا لا يمكن الوصول إليها من خارج الحزمة.

 //save by A.java package pack; class A{ void msg(){System.out.println('Hello');} } 
 //save by B.java package mypack; import pack.*; class B{ public static void main(String args[]){ A obj = new A();//Compile Time Error obj.msg();//Compile Time Error } } 

في المثال أعلاه، نطاق الفئة A وطريقتها msg()‎ هو النطاق الافتراضي لذا لا يمكن الوصول إليه من خارج الحزمة.


3) المحمية

ال معدل الوصول المحمي يمكن الوصول إليه داخل الحزمة وخارجها ولكن من خلال الميراث فقط.

يمكن تطبيق معدّل الوصول المحمي على عضو البيانات والطريقة والمنشئ. لا يمكن تطبيقه على الفصل.

يوفر إمكانية وصول أكبر من المعدل الافتراضي.

تحويل كائن جافا إلى json

مثال على معدّل الوصول المحمي

في هذا المثال، قمنا بإنشاء الحزمتين pack وmypack. حزمة الفئة A عامة، لذا يمكن الوصول إليها من خارج الحزمة. ولكن تم الإعلان عن طريقة msg لهذه الحزمة على أنها محمية، لذا لا يمكن الوصول إليها من خارج الفصل إلا من خلال الميراث.

 //save by A.java package pack; public class A{ protected void msg(){System.out.println('Hello');} } 
 //save by B.java package mypack; import pack.*; class B extends A{ public static void main(String args[]){ B obj = new B(); obj.msg(); } } 
 Output:Hello 

4) العامة

ال معدّل الوصول العام يمكن الوصول إليه في كل مكان. لديها أوسع نطاق بين جميع المعدلات الأخرى.

مثال على معدّل الوصول العام

 //save by A.java package pack; public class A{ public void msg(){System.out.println('Hello');} } 
 //save by B.java package mypack; import pack.*; class B{ public static void main(String args[]){ A obj = new A(); obj.msg(); } } 
 Output:Hello 

معدّلات الوصول إلى Java مع تجاوز الطريقة

إذا كنت تقوم بتجاوز أي طريقة، فيجب ألا تكون الطريقة التي تم تجاوزها (أي المعلن عنها في فئة فرعية) أكثر تقييدًا.

 class A{ protected void msg(){System.out.println('Hello java');} } public class Simple extends A{ void msg(){System.out.println('Hello java');}//C.T.Error public static void main(String args[]){ Simple obj=new Simple(); obj.msg(); } } 

المعدل الافتراضي أكثر تقييدًا من المحمي. ولهذا السبب، هناك خطأ في وقت الترجمة.