الوحدة 3: حماية البيانات والتحكم بالوصول · الموضوع 5 من 17
الموضوع 5

محددات الوصول Access Modifiers

كلمات تُكتب قبل الكلاس أو الخاصية أو الدالة، تحدّد من يستطيع الوصول إليها.

privatedefaultprotectedpublic
بعد هذا الدرس ستستطيع أن:
  • تميّز بين معدّلات الوصول access modifiers ومعدّلات عدم الوصول non-access modifiers.
  • تحدد نطاق الوصول لكل من public و private و protected و default.
  • تتوقّع خطأ الترجمة عند الوصول إلى عضو غير مسموح بالوصول إليه.
  • تختار محدد الوصول المناسب لكل خاصية ودالة في الكلاس.

١أقسام المعدّلات Modifiers

Modifiers Access Non-Access public · privateprotected · defaultfinal · abstract · statictransient · volatile · synchronized تتحكّم في مستوى الوصولوظائف أخرى
نوعان من المعدّلات؛ هذا الدرس عن الأول، والدرس القادم عن أهم ما في الثاني.

٢معدّلات الوصول الأربعة

تُكتب قبل اسم: الكلاس، أو دالة البناء، أو المتغير، أو الدالة.

المحددداخل الكلاسداخل الحزمةخارج الحزمة بالوراثةخارج الحزمة بلا وراثة
private✓✗✗✗
default (بلا كلمة)✓✓✗✗
protected✓✓✓✗
public✓✓✓✓

الدوائر في رأس الصفحة تمثّل الجدول نفسه: كل محدد يشمل نطاق ما قبله ويزيد عليه.

مثال الحزمتين p1 و p2

Package p1
class C1
  • public int a;
  • protected int b;
  • int c;
  • private int d;
class C2
C1 o = new C1( );
  • o.a;يمكن الوصول له
  • o.b;يمكن الوصول له
  • o.c;يمكن الوصول له
  • o.d;لا يمكن
class C3 extends C1
  • a;يمكن الوصول له
  • b;يمكن الوصول له
  • c;يمكن الوصول له
  • d;لا يمكن
Package p2
class C4
C1 o = new C1( );
  • o.a;يمكن الوصول له
  • o.b;لا يمكن
  • o.c;لا يمكن
  • o.d;لا يمكن
class C5 extends C1
  • a;يمكن الوصول له
  • b;يمكن الوصول له
  • c;لا يمكن
  • d;لا يمكن
لكل كلاس اسأل سؤالين: هل هو في حزمة C1 نفسها؟ وهل يرث C1؟
الخلاصة
privateأقوى حماية
defaultداخل الحزمة فقط
protectedمثل default لكن يفتح الباب للوراثة من حزم أخرى
publicمفتوح للجميع

٣دالة بناء من نوع private

إذا جعلت دالة البناء private فلا يمكن إنشاء كائن من ذلك الكلاس من خارجه:

Simple.java
class A{    //private constructor    private A(){        System.out.println("Welcome my object");    }    void msg(){        System.out.println("Hello java");    }}public class Simple{    public static void main(String args[]){        //Compile Time Error        A obj=new A();    }}
Output – (build)×
Simple.java:13: error: A() has private access in A

جرّب الزر «شغّل هنا» لترى رسالة المترجِم بنفسك.

٤ما الاستخدام الأمثل لمحددات الوصول؟

المحددمتى نستخدمه؟
defaultنستخدمه لحصر الوصول إلى العضو (متغير أو دالة أو كلاس) داخل الحزمة نفسها فقط، ومنعه عن أي كلاس خارجها حتى لو كان يرث الكلاس. مثال: كلاسات داخل حزمة واحدة تتعاون وتتشارك البيانات، بينما تبقى هذه التفاصيل مخفية عن أي حزمة أخرى تستخدمها.
publicللدوال التي نريد للجميع استخدامها.
privateللمتغيرات (الخصائص) دائمًا تقريبًا، مع دوال عامة للوصول إليها: هذا هو التغليف.
protectedلعضو نريد أن تصل إليه الكلاسات الوارثة حتى لو كانت في حزمة أخرى.

محددات الكلاس نفسه

التدريب العملي 8: تجربة المحددات الأربعة بين حزمتينمشروع Access Modifiers بحزمتين: package1 فيها ClassA و ClassB، و package2 فيها ClassC.افتح التدريب ←

توقّع وتحقّق

أجب قبل أن تنظر إلى الشرح. التصحيح فوري، وإجاباتك تُحفظ.

خاصية private يمكن الوصول إليها من:

إذا لم نكتب أي محدد وصول يكون:

تأمل الكود التالي من التدريب 8:

snippet
// File: ClassA.javapackage package1;public class ClassA {    public String f_public = "public";    private String f_private = "private";    protected String f_protected = "protected";    String f_default = "default";} // File: ClassC.javapackage package2;import package1.ClassA;public class ClassC extends ClassA {}

الكلاس ClassC موجود في حزمة أخرى package2 ويرث ClassA. ما الخصائص التي يستطيع ClassC الوصول إليها؟

protected يسمح بالوصول من حزمة أخرى عن طريق الوراثة. أما f_default فداخل الحزمة package1 فقط، و f_private داخل ClassA فقط.

أي محدد يناسب خصائص الكلاس عادةً؟

ثم نوفّر دوال public للتعامل معها: التغليف.

الخلاصة

انتقل إلى تقييم الدرسأسئلة التقييم، وأكمل الفراغات، وتمارين UML.ابدأ التقييم ←