معدِّلات مستوى الوصول. معدِّلات الوصول
سنحاول هنا تغطية جميع حالات استخدام معدِّلات الوصول تقريبًا. الاستثناءات الوحيدة هي استخدامها للتداخل ( متداخل) وداخلي ( داخلي) ، وكذلك للواجهات ، لأننا لم نفكر في هذه الموضوعات بعد.
تعمل الفئات والحزم المستخدمة جنبًا إلى جنب مع معدِّلات الوصول كوسائل تغليف ، أي وسيلة لإخفاء تفاصيل التنفيذ خلف واجهة بسيطة.
يمكن تطبيق مُعدِّلات الوصول على كل من الفئات وأعضائها - الحقول والأساليب. هناك أربعة مُعدِّلات وصول إجمالاً ، وسنقدم هنا وصفًا موجزًا لها ، ثم سننظر في كل منها بالتفصيل.
- عام- تم التصريح عن أي مكون باسم عام، يمكن الوصول إليه من أي رمز
- محمي- يسمح بالوصول إلى المكون داخل الحزمة والفئات التابعة لها
- نشر- يسمح بالوصول إلى المكونات داخل الفصل
- إفتراضي(بدون كلمة رئيسية) - يسمح بالوصول إلى المكونات الموجودة داخل الحزمة
الفصول الموروثة هي فئات موروثة من الفصل. لم ندرس الميراث بعد.
الوصول إلى الفصول الدراسية
بشكل افتراضي ، تتوفر فئات المستوى الأعلى في الحزمة التي تم تعريفها فيها.... ومع ذلك ، إذا تم التصريح عن فئة المستوى الأعلى باسم عامإذن فهي متوفرة في كل مكان (أو في أي مكان تتوفر فيه الحزمة نفسها). لقد قصرنا هذا البيان على فئات المستوى الأعلى لأنه يمكن إعلان الفئات كأعضاء في فئات أخرى. نظرًا لأن هذه الفئات الداخلية أعضاء في الفصل ، فإنها تخضع لقواعد التحكم في الوصول إلى أعضاء الفصل..
الوصول إلى أعضاء الفصل
أعضاء الفصل موجودون دائمًا داخل جسم الفصل. تقصيريتوفر أعضاء الفصل أيضًا في الحزمة التي يتم فيها تعريف الفئة.
المعدل العام
بالنسبة للفئة غير المتداخلة ، يمكن تحديد واحد فقط من مستويي وصول محتملين: معطى إفتراضيو عام . عندما يتم الإعلان عن الفصل كـ عام، يجب أن يكون هو الوحيد عامتم الإعلان عن الفئة في الملف ويجب أن يتطابق اسم الملف مع اسم الفئة.
كيف عاميمكن الإعلان عن الفئات والحقول والأساليب والمُنشئين.
معدل محمي
سنلقي نظرة فاحصة على هذا المعدل في موضوع وراثة الفصل. إذا لم يتم استخدام الوراثة ، فإن هذا المعدل يعمل تمامًا مثل المعدل الافتراضي.
الشيء الوحيد الذي يمكن قوله بإيجاز الآن هو أن المكونات تم إعلانها كـ محميسوف يكون الوصول أي فئة طفل من أي حزمةأو أي فئة من نفس الباقة.
كيف محمييمكن الإعلان عن الحقول والأساليب والمنشئات والفئات المتداخلة والواجهات المتداخلة.
محمي .
معدل خاص
هذا هو المعدّل الأكثر تقييدًا من حيث تقييد الوصول. تم إعلان العناصر على أنها نشريمكن الوصول إليها فقط داخل نفس الفصل ولا يمكن الوصول إليها لأي شخص خارج الفصل.
كيف نشريمكن الإعلان عن الحقول والأساليب والمُنشئين والفئات المتداخلة والواجهات المتداخلة.
لا يمكن التصريح عن واجهات وفئات المستوى الأعلى كـ نشر .
تعد معدّلات الوصول موضوعًا بسيطًا ، لكننا سنعود إليها لاحقًا. بينما كان مجرد أحد معارفه. والآن القليل من الممارسة ...
لقد أنشأت فئات Mod02.java و DefMod.java و ProMod.java و PrvMod.java تنتمي إلى الحزمة pro.java.pkg002 ، بالإضافة إلى فئة PubMod.java التي تنتمي إلى الحزمة pro.java.pkg003. بعد ذلك ، سأقدم فقط لقطات شاشة لهذه الفئات ونتائج البرنامج:
مهلا! في محاضرة اليوم سوف نتعرف على مفهوم " معدلات الوصول»والنظر في أمثلة العمل معهم. على الرغم من أن كلمة "تعرف على" لن تكون صحيحة تمامًا: فأنت تعرف بالفعل معظمها من المحاضرات السابقة. فقط في حالة ، دعونا نعيد تنشيط ذاكرتنا على الشيء الرئيسي. معدِّلات الوصول- غالبًا ما تكون هذه الكلمات الرئيسية التي تنظم مستوى الوصول إلى أجزاء مختلفة من التعليمات البرمجية الخاصة بك. لماذا "في أغلب الأحيان"؟ نظرًا لأن أحدها يتم تعيينه افتراضيًا ولا تتم الإشارة إليه بكلمة رئيسية :) هناك أربعة معدلات وصول في Java في المجموع. دعنا ندرجها بالترتيب من الأكثر صرامة إلى الأكثر "معتدلة":
- نشر؛
- محمي؛
- الافتراضي (الحزمة مرئية) ؛
- عام.
معدل خاص
![](https://i1.wp.com/javarush.ru/images/article/6a8c0181-8bbe-442e-b040-c74c62501986/1024.jpeg)
معدل محمي
معدّل الوصول التالي الأقوى محمي.![](https://i2.wp.com/javarush.ru/images/article/8d4b98ea-fbf8-4bd6-89ff-7447166ab7c7/1024.jpeg)
- ضمن جميع الفئات الموجودة في نفس الحزمة مثل مجموعتنا ؛
- في جميع الفئات التي ترث من صفنا.
حزمة تعديل مرئية
علاوة على ذلك ، فإن القائمة هي المُعدِّل الافتراضي ، أو كما يُطلق عليها أيضًا الحزمة المرئية. لا يتم الإشارة إليها بكلمة رئيسية حيث يتم تعيينها افتراضيًا في Java لجميع الحقول والأساليب. إذا كتبت في التعليمات البرمجية الخاصة بك - int x = 10 ... المتغير x سيكون له حق الوصول المرئي لهذه الحزمة. من السهل أن تتذكر ما يفعله. في الواقع ، الافتراضي = الميراث المحمي :) حالات استخدامه محدودة ، كما في حالة المعدل المحمي. في أغلب الأحيان ، يتم استخدام الوصول الافتراضي في حزمة حيث توجد بعض فئات الأدوات المساعدة التي لا تنفذ وظائف جميع الفئات الأخرى في هذه الحزمة. دعنا نعطي مثالا. تخيل أن لدينا حزمة " خدمات". داخلها فئات مختلفة تعمل مع قاعدة البيانات. على سبيل المثال ، هناك فئة UserService تقرأ بيانات المستخدم من قاعدة بيانات ، وفئة CarService التي تقرأ بيانات عن السيارات من نفس قاعدة البيانات ، وفئات أخرى ، كل منها يعمل مع نوع الكائنات الخاص به ويقرأ البيانات عنها من قاعدة البيانات. خدمات الحزمة خدمات حزمة UserService () من الفئة العامة ؛ () CarService من الفئة العامة ومع ذلك ، يمكن أن يحدث الموقف بسهولة عندما تكون البيانات الموجودة في قاعدة البيانات في تنسيق واحد ، ونحن بحاجة إليها في تنسيق آخر. تخيل أن تاريخ ميلاد المستخدم في قاعدة البيانات مخزَّن بالتنسيق TIMESTAMP WITH TIME ZONE ... 2014 - 04 - 04 20: 32: 59.390583 + 02 ... نحتاج بدلاً من ذلك إلى أبسط كائن - java.util.Date. لهذا الغرض ، يمكننا إنشاء مخطط فئة خاص داخل حزمة الخدمات. سيكون مسؤولاً عن تحويل البيانات من قاعدة البيانات إلى كائنات Java المعتادة. فئة المساعد البسيط. عادةً ما نقوم بإنشاء جميع الفئات كفئة عامة ClassName ، ولكن هذا ليس مطلوبًا. يمكننا أن نعلن أن فئة المساعد لدينا هي ببساطة مصمّم الخرائط. في هذه الحالة ، لا يزال يقوم بعمله ، لكنه غير مرئي لأي شخص خارج حزمة الخدمات! خدمات الحزمة خدمات حزمة class Mapper () ؛ خدمة CarService للفئة العامة (مخطط الخرائط ؛) وهذا في الواقع هو المنطق الصحيح: لماذا يرى أي شخص خارج الحزمة فئة مساعدة تعمل فقط مع فئات نفس الحزمة؟المعدل العام
أخيرًا وليس آخرًا ، المُعدِّل العام! لقد قابلته في أول يوم دراستك في CodeGym من خلال تشغيل نظام أساسي عام ثابت (String args) لأول مرة في حياتك.![](https://i1.wp.com/javarush.ru/images/article/4323b90c-193c-444c-88e4-cfd8af695107/1024.jpeg)
توفر لغة Java العديد من المعدلات ، مقسمة إلى الفئات التالية:
- الوصول الى المعدل
- معدل عدم الوصول
يتم استخدام المعدل لتعريف فئة أو طريقة أو متغير ، وعادة ما يكون في مقدمة البيان. من خلال المثال التالي للتوضيح:
فئة عامة className (// ...) منطقية خاصة myFlag؛ الأسابيع المزدوجة الثابتة النهائية = 9.5 ؛ BOXWIDTH النهائي المحمي الثابت = 42 ؛ عام ثابت باطل رئيسي (وسيطات سلسلة) (// 方法 小)
معدل التحكم في الوصول
Java ، يمكنك استخدام أحرف التحكم في الوصول لحماية الوصول إلى الفئات والمتغيرات والطرق والمنشئات. تدعم Java أربعة أذونات مختلفة.
الافتراضي ، المعروف أيضًا باسم القيمة بواسطة إفتراضي،مرئي في نفس الحزمة ، لا تستخدم أي معدل.
خاص بالمحدد نشرمعدل مرئي داخل نفس الفئة.
نعم ، للإشارة جنرال لواءمعدل مرئي لجميع الفئات.
محمي ، في محمييحدد المعدل أن جميع الفئات والفئات الفرعية داخل نفس الحزمة مرئية.
معدّل الوصول الافتراضي هو عدم استخدام أي كلمات رئيسية
استخدم المتغيرات والأساليب المعلنة في معدل الوصول الافتراضي لفئة داخل نفس الحزمة المرئية. واجهة يتم فيها إعلان المتغيرات ضمنيًا على أنها نهائية ثابتة عامة ، وواجهة يكون فيها الموصل الافتراضي عامًا.
العبارة في المثال التالي ، المتغيرات والأساليب لا يمكن أن تستخدم أي معدل.
إصدار السلسلة = "1.5.1" ؛ عملية منطقيةOrder () (إرجاع صحيح ؛)
معدل الوصول الخاص - خاص
يعد معدل الوصول الخاص هو أكثر مستويات الوصول صرامة ، ويتم الإعلان عنه على أنه طرق خاصة ومتغيرات وينتمي إلى فئة المُنشئ لا يمكن الوصول إليه إلا ، ولكن لا يمكن اعتبار الفئات والواجهات خاصة.
لا يمكن الوصول إلى المتغيرات المعلنة كنوع وصول خاص إلا خارج الفصل الدراسي من خلال فئة أسلوب getter العام.
يتم استخدام مُعدِّل الوصول الخاص بشكل أساسي لفئة الحماية الخاصة بتفاصيل التنفيذ والبيانات الموجودة خلف الفصل الدراسي.
تستخدم الفئات التالية معدّل وصول خاص:
مسجل فئة عام (تنسيق سلسلة خاص ؛ سلسلة عامة getFormat () (إرجاع this.format ؛) تنسيق مجموعة باطلة عامة (تنسيق سلسلة) (this.format = format ؛))
على سبيل المثال ، التنسيق المتغير لفئة المسجل هو متغير خاص بحيث لا يمكن للفئات الأخرى الحصول على قيمة المتغير وتعيينها مباشرة. لكي تكون قادرًا على العمل مع متغير فئة آخر ، فإنه يحدد طريقتين عامتين: GetFormat () (تنسيق قيمة الإرجاع) و SetFormat (String) (إعداد التنسيق)
معدل الوصول المفتوح - عام
تم الإعلان عن الفئات والطرق والمنشئات والواجهات العامة التي يمكن أن تكون أي نوع آخر من الوصول.
إذا كانت الزيارات المتبادلة المتعددة للفصول العامة في حزم مختلفة ، فأنت بحاجة إلى استيراد حزمة الطبقة العامة المقابلة. نظرًا لأن وراثة الطبقة ، يمكن أن ترث الفئات الفرعية فئة من جميع الأساليب والمتغيرات العامة.
تستخدم الميزات التالية التحكم في الوصول العام:
رئيسي باطل ثابت عام (وسيطات سلسلة) (// ...)
يجب تعيين طريقة برنامج Java الرئيسي () في الأماكن العامة ، وإلا فلن يتمكن مترجم Java من تشغيل الفصل.
معدلات الوصول المحمية محمية
يمكن أن تكون المتغيرات والطرق والمنشئات المحمية في نفس الحزمة من أي نوع آخر من الوصول ، ويمكن الوصول إليها في حزم مختلفة من الفئات الفرعية.
لا يمكن تعديل معدّل الوصول المحمي عن طريق الفئات والواجهات ، ويمكن إعلان الطرق والمتغيرات الأعضاء محمية ، ولكن لا يمكن إعلان حماية المتغيرات وأساليب الأعضاء في الواجهات.
يمكن للفئات الفرعية المعدلة الوصول إلى الطرق والمتغيرات المحمية المعلنة ، حتى نتمكن من حماية الفئات غير المرتبطة باستخدام هذه الطرق والمتغيرات.
تستخدم الفئة الرئيسية التالية معدل الوصول المحمي ، وتتجاوز الفئات الفرعية طريقة openSpeaker () الخاصة بالفئة الأصلية.
Class AudioPlayer (OpenSpeaker المنطقي المحمي (مكبر الصوت sp) (// 实现 细节)) فئة StreamingAudioPlayer (منطقي openSpeaker (مكبر الصوت sp) (// 实现 细节))
إذا تم إعلان أن طريقة openSpeaker () خاصة ، فبالإضافة إلى فئة AudioPlayer ، لا يمكنها الوصول إلى الطريقة. إذا تم الإعلان عن openSpeaker () للجمهور ، فإن جميع الفئات لديها القدرة على الوصول إلى الطريقة. إذا أردنا أن نجعل العملية مرئية للفئات الفرعية للفئة ، فسيتم إعلان أن الطريقة محمية.
التحكم في الوصول والميراث
لاحظ القواعد الموروثة التالية:
تم الإعلان عن الفئة الرئيسية كطرق عامة في الفئة الفرعية يجب أن تكون عامة أيضًا.
تم التصريح عن الفئة الرئيسية كطريقة محمية في الفئة الفرعية ، أو تم الإعلان عنها على أنها محمية ، أو تم الإعلان عنها علنًا. لا يمكن إعلان أنك خاص.
تم التصريح عن الفئة الأصل كطريقة خاصة ولا يمكن توريثها.
معدل عدم الوصول
من أجل تحقيق عدد من الميزات الأخرى ، توفر Java أيضًا عددًا من معدِّلات عدم الوصول.
يستخدم المعدل الثابت لإنشاء طرق الفئة ومتغيرات الفئة.
المعدل النهائي المستخدم لتزيين الفئات والطرق والمتغيرات ، لا يمكن توريث الفئة المعدلة النهائية ، ولا يمكن توريث طريقة الفئة المعدلة ، أو تجاوزها ، ولا يمكن تغيير ثوابت المتغيرات المعدلة.
يتم استخدام المعدل المجرد لإنشاء فئات مجردة وطرق مجردة.
المعدلات المتزامنة والمتطايرة ، ومعظمها لبرمجة الخيوط.
معدل ثابت
المتغيرات الثابتة:
تُستخدم الكلمة الأساسية الثابتة للإعلان عن متغيرات ثابتة مستقلة عن الكائن ، بغض النظر عن عدد الكائنات الموجودة في الطبقة ، فهي نسخة واحدة فقط من المتغير الثابت. تُعرف المتغيرات الثابتة أيضًا باسم متغيرات الفئة. لا يمكن التصريح عن المتغيرات المحلية كمتغيرات ثابتة.
طرق ثابتة:
يتم استخدام الكلمة الأساسية الثابتة للإعلان عن كائن مستقل عن الأسلوب الثابت. لا يمكن للطرق الثابتة استخدام فئة متغيرة غير ثابتة. طريقة ثابتة للحصول على البيانات من قائمة المعلمات ثم حساب البيانات.
يمكن استخدام الوصول إلى متغيرات الفئة والطرق مباشرة عن طريق موصلي classname.variablename و classname.methodname.
في المثال التالي ، يتم استخدام معدل ثابت لإنشاء طرق فئة ومتغيرات فئة.
فئة عامة InstanceCounter (خاص ثابت int numInstances = 0 ؛ getCount ثابت محمي () (return numInstances ؛) addInstance () (numInstances ++ ؛) InstanceCounter () (InstanceCounter.addInstance () ؛) عام ثابت باطل رئيسي ( وسيطات السلسلة) (System.out.println ("البدء بـ" + InstanceCounter.getCount () + "المثيلات") ؛ لـ (int i = 0 ؛ i< 500; ++i){ new InstanceCounter(); } System.out.println("Created " + InstanceCounter.getCount() + " instances"); } }
أمثلة على النتائج المذكورة أعلاه من عملية التحرير على النحو التالي:
بدأت مع 0 مثيل تم إنشاء 500 مثيل
المصنف النهائي
المتغيرات النهائية:
يمكن تهيئة المتغيرات النهائية بشكل صريح وتهيئتها مرة واحدة فقط. تم التصريح عن الدليل ككائنات طرفية لا يمكن أن يشير إلى كائن آخر. لكن الهدف النهائي هو المكان الذي يمكن فيه تغيير البيانات. لا يمكن تغيير مرجع الكائن النهائي هذا ، ولكن يمكن تغيير قيمته.
عادة ما يتم استخدام المعدل النهائي معًا لإنشاء ثابت ثابت لفئة المعدل.
اختبار فئة عامة (قيمة int النهائية = 10 ؛ // 下面 是 声明 常量 的 实例 public static final int BOXWIDTH = 6 ؛ ثابت نهائي String TITLE = "(! LANG: Manager"; public void changeValue(){ value = 12; //将输出一个错误 } } !}
الطريقة النهائية
يتم توارث طرق الفئة النهائية بواسطة الفئات الفرعية ، ولكن لا يمكنها تعديل الفئات الفرعية.
الغرض الرئيسي من الطريقة هو منع تغيير البيان النهائي لتلك الطريقة.
كما هو موضح أدناه ، باستخدام الطرق النهائية لمعدلات التصريح.
اختبار الفصل العام (تغيير اسم الفراغ النهائي العام () (// 方法 小))
الفئة النهائية
لا يمكن توريث فئات النهاية ، ولا يمكن لأي فئة أن ترث أيًا من خصائص الفئة النهائية.
اختبار الفصل النهائي العام (// 类 家)
معدل الملخص
فئة الملخص:
لا يمكن استخدام فئة مجردة لإنشاء مثيل لكائن ، والغرض الوحيد من العبارة هو فئة مجردة للامتدادات المستقبلية لتلك الفئة.
لا يمكن تغيير الفصل بشكل تجريدي ونهائي. إذا كانت الفئة تحتوي على طرق مجردة ، فيجب التصريح عن الفئة كفئة مجردة ، وإلا فسيكون خطأ مترجم.
يمكن للفئة المجردة أن تحتوي على طرق مجردة وطرق غير مجردة.
فئة الخلاصة Caravan (سعر مزدوج خاص ؛ نموذج سلسلة خاص ؛ سنة سلسلة خاصة ؛ فراغ الملخص العام goFast () ؛ // 抽象 方法 public abstract void changeColor () ؛)
طريقة مجردة
لا توجد طريقة هي تنفيذ طريقة مجردة ، وهي طريقة ملموسة لتنفيذ الفئات الفرعية المقدمة. لا يمكن إعلان الأساليب المجردة نهائية وصارمة.
أي فئة فرعية ترث من فئة مجردة يجب أن تنفذ جميع الطرق المجردة للفئة الأصلية ، ما لم تكن الفئة الفرعية فئة مجردة.
إذا كان الفصل يحتوي على عدد من الطرق المجردة ، فيجب التصريح عن الفئة كفئة مجردة. لا يمكن أن تحتوي فئة مجردة على طرق مجردة.
إعلان طريقة مجردة ينتهي بفاصلة منقوطة ، على سبيل المثال: النمط التجريدي العام ()؛
فئة الملخص العامة SuperClass (abstract void m () ؛ // 抽象 方法) الفئة الفرعية تمتد SuperClass (// 实现 抽象 方法 void m () (.........))
معدل متزامن
طريقة الكلمات الرئيسية المتزامنة للإعلان عن وصول مؤشر ترابط واحد فقط في نفس الوقت. يمكن تطبيق معدل متزامن على أربعة معدلات وصول.
تفاصيل عرض الفراغ المتزامن العام () (.......)
معدل عابر
يحتوي الكائن المتسلسل على متغيرات عابرة لمثيل جهاز جافا الظاهري (JVM) لتخطي هذا المتغير المحدد.
يتم تضمين معدل في تعريف متغير الإعلان للمعالجة المسبقة لنوع البيانات والفئات المتغيرة.
الحد العام العابر = 55 ؛ // لن تستمر في العمل العام ب ؛ // سيستمر
المعدلات المتطايرة
يتم إجبار متغير عضو معدل متغير على إعادة قراءة قيمة متغير العضو من الذاكرة المشتركة في كل مرة يتم الوصول إليه. بالإضافة إلى ذلك ، عند تغيير متغيرات الأعضاء ، يتم إجبار مؤشر الترابط على تغيير القيمة التي تتم كتابتها مرة أخرى إلى الذاكرة المشتركة. لذلك في أي وقت ، يرى موضوعان مختلفان دائمًا نفس قيمة متغير العضو.
فئة عامة MyRunnable تنفذ Runnable (نشط منطقي متغير خاص ؛ تشغيل باطل عام () (نشط = صحيح ؛ بينما (نشط) // 第一 行 (// 代码)) توقف عام باطل () (نشط = خطأ ؛ // 第二行))
في ظل الظروف العادية ، يستدعي مؤشر ترابط أسلوب Run () (على مؤشر ترابط مفتوح قابل للتشغيل) في مؤشر ترابط استدعاء آخر إلى أسلوب stop (). إذا كانت القيمة النشطة في السطر الأول يستخدم في المخزن المؤقت الصف الثاني عندما تكون الدورة النشطة خاطئة ، فإنها لا تتوقف.
ومع ذلك ، في الكود أعلاه ، نستخدم نشطًا متغيرًا معدلًا ، لذلك ستتوقف الحلقة.
آخر تحديث: 20.04.2018
جميع أعضاء فئة Java - الحقول والأساليب - لديهم معدلات وصول. في الموضوعات السابقة ، واجهنا بالفعل المعدل العام. تسمح لك معدّلات الوصول بتعيين النطاق الصالح لأعضاء الفئة ، أي السياق الذي يمكن فيه استخدام متغير أو طريقة معينة.
تستخدم Java معدِّلات الوصول التالية:
الجمهور: عام ، أو فئة عامة ، أو عضو في الفصل. الحقول والأساليب المعلنة بواسطة المُعدِّل العام مرئية للفئات الأخرى من الحزمة الحالية ومن الحزم الخارجية.
خاص: فئة خاصة أو عضو في فئة بخلاف المعدل العام. لا يمكن الوصول إلى فصل دراسي خاص أو عضو في الفصل إلا من رمز في نفس الفصل.
محمي: يمكن الوصول إلى فئة أو عضو في الفصل من أي مكان في الفئة أو الحزمة الحالية أو في الفئات المشتقة ، حتى لو كانت في حزم أخرى
المعدل الافتراضي... يعني عدم وجود معدل لحقل أو طريقة لفئة أنه يتم تطبيق معدل افتراضي عليه. هذه الحقول أو الطرق مرئية لجميع الفئات في الحزمة الحالية.
لنلقِ نظرة على معدِّلات الوصول باستخدام البرنامج التالي كمثال:
برنامج فئة عامة (عام ثابت باطل رئيسي (سلسلة args) (شخص kate = شخص جديد ("Kate"، 32، "Baker Street"، "+12334567")؛ kate.displayName ()؛ // معايير ، طريقة kate العامة. displayAge () ؛ // حسنًا ، تحتوي الطريقة على معدل افتراضي kate.displayPhone () ؛ // موافق ، الطريقة المحمية //kate.displayAddress () ؛ // خطأ ، طريقة خاصة System.out.println (kate. name) ؛ // المعايير ، المعدل افتراضيًا System.out.println (kate.address) ؛ // المعايير ، المعدل العام System.out.println (kate.age) ؛ // القواعد ، المعدل المحمي // System.out. println (kate.phone) ؛ //! خطأ ، مُعدِّل خاص)) فئة الشخص (اسم السلسلة ؛ عمر int محمي ؛ عنوان سلسلة عام ؛ هاتف سلسلة خاص ؛ شخص عام (اسم السلسلة ، العمر int ، عنوان السلسلة ، هاتف السلسلة) ( this. name = name؛ this.age = age؛ this.address = address؛ this.phone = phone؛) public void displayName () (System.out.printf ("Name:٪ s \ n"، name)؛) عرض باطل () (System.out.printf ("العمر:٪ d \ n" ، العمر) ؛) الفراغ الخاص د isplayAddress () (System.out.printf ("العنوان:٪ s \ n" ، العنوان) ؛ ) شاشة عرض باطلة محمية () (System.out.printf ("الهاتف:٪ s \ n" ، الهاتف) ؛))
في هذه الحالة ، توجد كلا الفئتين في نفس الحزمة - الحزمة افتراضيًا ، لذلك في فئة البرنامج يمكننا استخدام جميع الطرق والمتغيرات الخاصة بفئة الشخص ، والتي لها معدل افتراضي ، عام ومحمي. ولن تتوفر الحقول والأساليب ذات المُعدِّل الخاص في فئة البرنامج.
إذا كانت فئة البرنامج موجودة في حزمة أخرى ، فلن تتوفر لها سوى الحقول والأساليب ذات المُعدِّل العام.
يجب أن يسبق معدّل الوصول بقية تعريف المتغير أو الأسلوب.
التغليف
يبدو ، لماذا لا يتم التصريح عن جميع المتغيرات والطرق مع المُعدِّل العام بحيث تكون متاحة في أي مكان في البرنامج ، بغض النظر عن الحزمة أو الفئة؟ خذ على سبيل المثال مجال العمر الذي يمثل العمر. إذا كان لفئة أخرى وصول مباشر إلى هذا الحقل ، فهناك احتمال أن يتم تمرير قيمة غير صحيحة إليها أثناء تنفيذ البرنامج ، على سبيل المثال ، رقم سالب. تغيير البيانات بهذه الطريقة غير مرغوب فيه. أو نريد أن تكون بعض البيانات متاحة مباشرة حتى يمكن طباعتها على وحدة التحكم أو معرفة قيمتها فقط. في هذا الصدد ، يوصى بتقييد الوصول إلى البيانات قدر الإمكان من أجل حمايتها من الوصول غير المرغوب فيه من الخارج (للحصول على قيمة وتغييرها). يضمن استخدام المعدلات المختلفة عدم تلف البيانات أو تغييرها بشكل غير صحيح. يُطلق على إخفاء البيانات ضمن نطاق معين اسم التغليف.
لذلك ، كقاعدة عامة ، بدلاً من استخدام الحقول مباشرةً ، كقاعدة عامة ، يتم استخدام طرق الوصول. على سبيل المثال:
Public class Program (public static void main (String args) (Person kate = new Person ("Kate"، 30)؛ System.out.println (kate.getAge ())؛ // 30 kate.setAge (33) ؛ النظام .out.println (kate.getAge ()) ؛ // 33 kate.setAge (123450) ؛ System.out.println (kate.getAge ()) ؛ // 33)) class Person (اسم سلسلة خاص ؛ عمر int خاص ؛ Public Person (String name، int age) (this.name = name؛ this.age = age؛) public String getName () (return this.name؛) public void setName (String name) (this.name = name؛ ) public int getAge () (أرجع this.age ؛) مجموعة باطلة عامة (int age) (if (age> 0 && age)< 110) this.age = age; } }
وبعد ذلك ، بدلاً من العمل مباشرةً مع حقول الاسم والعمر في فئة الشخص ، سنعمل بالطرق التي تحدد قيم تلك الحقول وتعيدها. طرق setName و setAge وما شابه ذلك تسمى أيضًا المتحولات ، لأنها تغير قيم الحقل. وتسمى الطرق getName و getAge وما شابه ذلك باسم accessors ، لأننا بمساعدتهم نحصل على قيمة الحقل.
علاوة على ذلك ، يمكننا وضع منطق إضافي في هذه الأساليب. على سبيل المثال ، في هذه الحالة ، عندما يتغير العمر ، يتم إجراء فحص لمعرفة كيف تتوافق القيمة الجديدة مع النطاق المسموح به.
آخر تحديث: 03.10.2019
جميع أعضاء الفصل - الحقول والأساليب والخصائص - لديهم جميعًا معدلات الوصول... تسمح لك معدّلات الوصول بتعيين نطاق صالح لأعضاء الفصل الدراسي. أي أن معدِّلات الوصول تحدد السياق الذي يمكن فيه استخدام متغير أو طريقة معينة. في الموضوعات السابقة ، واجهناها بالفعل عندما أعلنا أن حقول الفصل ستكون عامة (أي مع المُعدِّل العام).
يتم استخدام معدلات الوصول التالية في C #:
الجمهور: عام ، أو فئة عامة ، أو عضو في الفصل. يمكن الوصول إلى عضو الفصل هذا من أي مكان في الكود ، وكذلك من البرامج والتجمعات الأخرى.
خاص: فئة خاصة أو عضو في فئة. يمثل العكس تمامًا من المعدل العام. لا يمكن الوصول إلى مثل هذا الفصل الخاص أو عضو الفصل إلا من التعليمات البرمجية الموجودة في نفس الفئة أو السياق.
محمي: يمكن الوصول إلى عضو الفصل هذا من أي مكان في الفصل الحالي أو في الفئات المشتقة. ومع ذلك ، يمكن أن توجد الفئات المشتقة في تجميعات أخرى.
داخلي: يمكن الوصول إلى فئة وأعضاء من فئة ذات معدل مماثل من أي مكان في الكود في نفس التجميع ، ولكنها غير متوفرة للبرامج والتجمعات الأخرى (كما هو الحال مع المعدل العام).
داخلي محمي: يجمع بين وظائف معدلين. تتوفر الفئات وأعضاء الفصل مع هذا المعدل من التجميع الحالي ومن الفئات المشتقة.
محمية خاصة: يمكن الوصول إلى عضو الفئة هذا من أي مكان في الفصل الحالي أو في الفئات المشتقة المحددة في نفس التجميع.
يمكننا تحديد معدّل الوصول بشكل صريح ، على سبيل المثال:
حالة فئة محمية خاصة (int a ؛ محمية باطلة Print () (Console.WriteLine ($ "a = (a)") ؛))
أو يمكننا حذف:
حالة الفئة (int a ؛ void Print () (Console.WriteLine ($ "a = (a)") ؛))
إذا لم يتم تحديد معدل وصول للحقول والأساليب ، فسيتم استخدام المعدل الخاص افتراضيًا.
الفئات والبنى التي تم الإعلان عنها بدون معدل لها وصول داخلي افتراضيًا.
كل الفئات والبنى التي تم تحديدها بشكل مباشر في مساحات الأسماء غير المتداخلة ضمن فئات أخرى يمكن أن تحتوي فقط على مُعدِّلات عامة أو داخلية.
لنلقِ نظرة على مثال وننشئ فئة الولاية التالية:
Public class State (// مثل private int الافتراضيVar ؛ int defaultVar ؛ // يمكن الوصول إلى الحقل فقط من الفئة الحالية الخاصة int privateVar ؛ // يمكن الوصول إليها من الفئة الحالية والفئات المشتقة التي تم تحديدها في نفس المشروع المحمي الخاص int protectedPrivateVar ؛ // متاح من الفئة الحالية والفئات المشتقة المحمية int protectedVar ؛ // متاح في أي مكان في المشروع الحالي الداخلي int InternalVar ؛ // متاح في أي مكان في المشروع الحالي ومن الفئات الموروثة في المشاريع الأخرى المحمية الداخلية المحمية الداخلية المحمية الداخلية ؛ // متاح في أي مكان في البرنامج ، وكذلك للبرامج والتجمعات الأخرى public int publicVar ؛ // افتراضيًا يحتوي على معدل افتراضي باطل خاص defaultMethod () => Console.WriteLine ($ "defaultVar = (defaultVar)") ؛ // الطريقة متاحة فقط من الفئة الحالية private void privateMethod () => Console.WriteLine ($ "privateVar = (privateVar)") ؛ // يمكن الوصول إليها من الفئة الحالية والفئات المشتقة المحددة في نفس الفقرة محمية خاصة محمية باطلة بروتيفاتميثود () => Console.WriteLine ($ "protectedPrivateVar = (protectedPrivateVar)") ؛ // يمكن الوصول إليها من الفئة الحالية والفئات المشتقة المحمية void protectedMethod () => Console.WriteLine ($ "protectedVar = (protectedVar)") ؛ // متاح في أي مكان في الفراغ الداخلي الداخلي للمشروع الحالي internalMethod () => Console.WriteLine ($ "internalVar = (internalVar)") ؛ // متاح في أي مكان في المشروع الحالي ومن الفئات الموروثة في مشاريع أخرى محمية باطلة داخلية محمية بروتنيرنال ميثود () => Console.WriteLine ($ "protectedInternalVar = (protectedInternalVar)") ؛ // متاح في أي مكان في البرنامج ، وكذلك للبرامج والتجمعات الأخرى public void publicMethod () => Console.WriteLine ($ "publicVar = (publicVar)")؛ )
نظرًا لإعلان فصل الولاية للجمهور ، فسيكون الوصول إليه متاحًا من أي مكان في البرنامج ، وكذلك من البرامج والتجمعات الأخرى. تحتوي فئة الولاية على خمسة حقول لكل مستوى وصول. بالإضافة إلى متغير واحد بدون معدل ، وهو خاص افتراضيًا.
هناك أيضًا ست طرق تعرض قيم حقول الفصل على الشاشة. يرجى ملاحظة أنه نظرًا لأن جميع المعدلات تسمح لك باستخدام أعضاء الفصل داخل هذه الفئة ، فإن جميع متغيرات الفئة ، بما في ذلك المتغيرات الخاصة ، متاحة لجميع طرقها ، نظرًا لأنها كلها في سياق فئة الولاية.
لنرى الآن كيف يمكننا استخدام متغيرات فصلنا في البرنامج (أي في الطريقة الرئيسية لفئة البرنامج) ، إذا كانت فصول الحالة والبرنامج في نفس المشروع:
Class Program (static void Main (string args) (State state1 = new State ()؛ // لن نتمكن من تعيين القيمة إلى defaultVar المتغير ، // نظرًا لأنه يحتوي على معدل خاص ولا ترى فئة البرنامج it // وهذا السطر هو البيئة التي سيتم تسطيرها على أنها state1.defaultVar خاطئة = 5 ؛ // خطأ ، لا يمكنك الوصول // وينطبق نفس الشيء على متغير privateVar state1.privateVar = 5 ؛ // خطأ ، لا يمكنك الوصول // تعيين قيمة متغير protectedPrivateVar لن يعمل ، // نظرًا لأن فئة البرنامج ليست فئة فرعية من حالة فئة الحالة. ستفشل أيضًا ، // نظرًا لأن فئة البرنامج ليست فئة فرعية من فئة State1.protectedVar = 5 ؛ // خطأ ، لا يمكنك الوصول // يمكن الوصول إلى المتغير الداخلي مع المعدل الداخلي من أي مكان في المشروع الحالي / / لذلك ، قم بتعيينها بأمان القيمة state1.internalVar = 5 ؛ // يمكن الوصول إلى المتغير protectedInternalVar أيضًا من أي مكان في حالة المشروع الحالية1.protectedInternalVar = 5 ؛ // publicVar متاحة للجمهور state1.publicVar = 5 ؛ ))
وبالتالي ، تمكنا من تعيين المتغيرات InternalVar و protectedInternalVar و publicVar ، لأن معدِّلاتها تسمح لنا باستخدامها في هذا السياق.
الوضع مشابه للطرق:
برنامج الفصل (ثابت باطل رئيسي (سلسلة args) (State state1 = new State () ؛ state1.defaultMethod () ؛ // خطأ ، لا يمكن الوصول إليه state1.privateMethod () ؛ // خطأ ، لا يمكن الوصول إليه state1.protectedPrivateMethod () ؛ // خطأ ، لا يمكنك الوصول إلى state1.protectedMethod () ؛ // خطأ ، لا يمكنك الوصول إلى state1.internalMethod () ؛ // معايير state1.protectedInternalMethod () ؛ // معايير state1.publicMethod () ؛ // معايير ))
هنا ، كانت هناك ثلاث طرق متاحة لنا فقط: InternalMethod ، و protectedInternalMethod ، و publicMethod ، والتي لديها المُعدِّلات الداخلية والمحمية الداخلية والعامة ، على التوالي.
بفضل نظام معدّلات الوصول هذا ، من الممكن إخفاء بعض جوانب تطبيق الفصل عن أجزاء أخرى من البرنامج.
على الرغم من حقيقة أن الجمهور والمعدلين الداخليين متشابهين في عملهم ، إلا أن لديهم فرقًا كبيرًا. ستتوفر أيضًا الفصول وأعضاء الفصل مع المُعدِّل العام للبرامج الأخرى إذا تم وضع الفصل المعين في مكتبة ديناميكية dll ثم استخدامها في هذه البرامج.