قائمة طعام
مجاني
التسجيل
الصفحة الرئيسية  /  النصيحة/ معدّلات مستوى الوصول. معدِّلات الوصول

معدِّلات مستوى الوصول. معدِّلات الوصول

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

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

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

  • عام- تم التصريح عن أي مكون باسم عام، يمكن الوصول إليه من أي رمز
  • محمي- يسمح بالوصول إلى المكون داخل الحزمة والفئات التابعة لها
  • نشر- يسمح بالوصول إلى المكونات داخل الفصل
  • إفتراضي(بدون كلمة رئيسية) - يسمح بالوصول إلى المكونات الموجودة داخل الحزمة

الفصول الموروثة هي فئات موروثة من الفصل. لم ندرس الميراث بعد.

الوصول إلى الفصول الدراسية

بشكل افتراضي ، تتوفر فئات المستوى الأعلى في الحزمة التي تم تعريفها فيها.... ومع ذلك ، إذا تم التصريح عن فئة المستوى الأعلى باسم عامإذن فهي متوفرة في كل مكان (أو في أي مكان تتوفر فيه الحزمة نفسها). لقد قصرنا هذا البيان على فئات المستوى الأعلى لأنه يمكن إعلان الفئات كأعضاء في فئات أخرى. نظرًا لأن هذه الفئات الداخلية أعضاء في الفصل ، فإنها تخضع لقواعد التحكم في الوصول إلى أعضاء الفصل..

الوصول إلى أعضاء الفصل

أعضاء الفصل موجودون دائمًا داخل جسم الفصل. تقصيريتوفر أعضاء الفصل أيضًا في الحزمة التي يتم فيها تعريف الفئة.

المعدل العام

بالنسبة للفئة غير المتداخلة ، يمكن تحديد واحد فقط من مستويي وصول محتملين: معطى إفتراضيو عام . عندما يتم الإعلان عن الفصل كـ عام، يجب أن يكون هو الوحيد عامتم الإعلان عن الفئة في الملف ويجب أن يتطابق اسم الملف مع اسم الفئة.

كيف عاميمكن الإعلان عن الفئات والحقول والأساليب والمُنشئين.

معدل محمي

سنلقي نظرة فاحصة على هذا المعدل في موضوع وراثة الفصل. إذا لم يتم استخدام الوراثة ، فإن هذا المعدل يعمل تمامًا مثل المعدل الافتراضي.

الشيء الوحيد الذي يمكن قوله بإيجاز الآن هو أن المكونات تم إعلانها كـ محميسوف يكون الوصول أي فئة طفل من أي حزمةأو أي فئة من نفس الباقة.

كيف محمييمكن الإعلان عن الحقول والأساليب والمنشئات والفئات المتداخلة والواجهات المتداخلة.

محمي .

معدل خاص

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

كيف نشريمكن الإعلان عن الحقول والأساليب والمُنشئين والفئات المتداخلة والواجهات المتداخلة.

لا يمكن التصريح عن واجهات وفئات المستوى الأعلى كـ نشر .

تعد معدّلات الوصول موضوعًا بسيطًا ، لكننا سنعود إليها لاحقًا. بينما كان مجرد أحد معارفه. والآن القليل من الممارسة ...

لقد أنشأت فئات Mod02.java و DefMod.java و ProMod.java و PrvMod.java تنتمي إلى الحزمة pro.java.pkg002 ، بالإضافة إلى فئة PubMod.java التي تنتمي إلى الحزمة pro.java.pkg003. بعد ذلك ، سأقدم فقط لقطات شاشة لهذه الفئات ونتائج البرنامج:

مهلا! في محاضرة اليوم سوف نتعرف على مفهوم " معدلات الوصول»والنظر في أمثلة العمل معهم. على الرغم من أن كلمة "تعرف على" لن تكون صحيحة تمامًا: فأنت تعرف بالفعل معظمها من المحاضرات السابقة. فقط في حالة ، دعونا نعيد تنشيط ذاكرتنا على الشيء الرئيسي. معدِّلات الوصول- غالبًا ما تكون هذه الكلمات الرئيسية التي تنظم مستوى الوصول إلى أجزاء مختلفة من التعليمات البرمجية الخاصة بك. لماذا "في أغلب الأحيان"؟ نظرًا لأن أحدها يتم تعيينه افتراضيًا ولا تتم الإشارة إليه بكلمة رئيسية :) هناك أربعة معدلات وصول في Java في المجموع. دعنا ندرجها بالترتيب من الأكثر صرامة إلى الأكثر "معتدلة":

  • نشر؛
  • محمي؛
  • الافتراضي (الحزمة مرئية) ؛
  • عام.
دعونا نلقي نظرة على كل منها ، ونقرر متى يمكن أن تكون مفيدة لنا ونعطي أمثلة :)

معدل خاص


الخاص هو معدّل الوصول الأكثر صرامة. يحد من رؤية البيانات والأساليب داخل فئة واحدة. أنت تعرف هذا المحرر من محاضرة عن الحاصلون والمحددون. هل تتذكر هذا المثال؟ فئة عامة Cat (اسم السلسلة العامة ؛ العمر int العام ؛ الوزن العام ؛ Cat العام (اسم السلسلة ، العمر int ، الوزن المعقول) (هذا. الاسم = الاسم ؛ هذا. العمر = العمر ؛ هذا. الوزن = الوزن ؛) القط العام () () sayMeow () العامة باطل (System. out. println ("Meow!") ؛)) فئة عامة رئيسية (رئيسية عامة باطلة ثابتة (String args) (Cat cat = new Cat () ؛ cat. name = " "؛ القط. العمر = - 1000 ؛ قطة. الوزن = 0 ؛)) نظرنا إليها في إحدى المقالات السابقة. هنا ارتكبنا خطأ فادحًا: فتحنا بياناتنا ، ونتيجة لذلك حصل زملاؤنا المبرمجون على حق الوصول مباشرة إلى حقول الفصل وتغيير قيمهم. علاوة على ذلك ، تم تعيين هذه القيم دون التحقق ، ونتيجة لذلك يمكنك في برنامجنا إنشاء قطة بعمر 1000 عام ، والاسم "" والوزن 0. لحل هذه المشكلة ، استخدمنا حاصل على وضعية، وكذلك تقييد الوصول إلى البيانات باستخدام المُعدِّل الخاص. فئة عامة Cat (اسم السلسلة الخاصة ؛ العمر الخاص بالخصوصية ؛ الوزن الخاص بالخصوصية ؛ Cat العامة (اسم السلسلة ، العمر int ، الوزن المعقول) (هذا. الاسم = الاسم ؛ هذا. العمر = العمر ؛ هذا. الوزن = الوزن ؛) القط العام () () sayMeow () عام باطل (System. out.println ("Meow!") ؛) اسم السلسلة العامة getName () (اسم الإرجاع ؛) setName العامة الباطلة (اسم السلسلة) (this. name = name ؛) public int getAge () (عمر الإرجاع ؛) setAge العامة الباطلة (العمر الفعلي) (هذا. العمر = العمر ؛) public int getWeight () (الوزن المرتجع ؛) مجموعة الفراغ العامة الوزن (الوزن المعقول) (هذا. الوزن = الوزن ؛)) في الواقع ، فإن تقييد الوصول إلى الحقول وتنفيذ حاصل الضبط هو المثال الأكثر شيوعًا لاستخدام الخاص في العمل الحقيقي. هذا هو الغرض الرئيسي من هذا المعدل هو تنفيذ التغليف في البرنامج.هذا لا ينطبق فقط على الحقول ، بالمناسبة. تخيل أن برنامجك لديه طريقة تنفذ بعض الوظائف المعقدة للغاية. للتوصل إلى مثل هذا المثال ... لنفترض أن طريقة readDataFromCollider () الخاصة بك تقبل عنوانًا يحتوي على بيانات كمدخلات ، وتقرأ البيانات من مصادم هادرون كبير بتنسيق بايت ، وتحول هذه البيانات إلى نص ، وتكتبها في ملف وتطبعها . حتى وصف الطريقة يبدو زاحفًا ، ناهيك عن الكود :) لزيادة إمكانية قراءة الكود ، سيكون من الجيد عدم كتابة منطق الأسلوب المعقد في مكان واحد ، ولكن على العكس من ذلك ، قم بتقسيم الوظيفة إلى طرق منفصلة. على سبيل المثال ، تعد طريقة readByteData () مسؤولة عن قراءة البيانات ، وتحول convertBytesToSymbols () البيانات المقروءة من المصادم إلى نص ، وتحفظ saveToFile () النص المستلم إلى ملف ، وتقوم printColliderData () بطباعة ملف البيانات الخاص بنا. ستصبح طريقة readDataFromCollider () في النهاية أكثر بساطة: فئة عامة ColliderUtil (فراغ عام readDataFromCollider (مسار pathToData) (byte colliderData = readByteData (pathToData) ؛ String textData = convertBytesToSymbols (colliderData) ؛ ملف fileWithFromData = textDollata) ؛) مسار pathToData) ( // يقرأ البيانات بالبايت) تحويل السلسلة العامة إلى BitesToSymbols (مصادم البايت DataInBytes) () ملف عام SaveToFile (String ColliderData) () printColliderData العام باطل (ملف fileWithColliderData) ( // يطبع البيانات من ملف)) ومع ذلك ، كما تتذكر من المحاضرة حول الواجهات ، لا يحصل المستخدم إلا على الواجهة النهائية. وطرقنا الأربعة ليست جزءًا منه. أنهم شركة فرعية: قمنا بإنشائها لتحسين قابلية قراءة الكود وليس لإلصاق أربع مهام مختلفة في طريقة واحدة. لا تحتاج إلى منح المستخدم حق الوصول إلى هذه الطرق. إذا كان المستخدم لديه حق الوصول إلى طريقة convertBytesToSymbols () عند العمل مع المصادم ، فمن المرجح أنه ببساطة لن يفهم ماهية هذه الطريقة وسبب الحاجة إليها. ما بايت يتم تحويلها؟ من أين أتوا؟ لماذا تحويلهم إلى نص؟ المنطق الذي يتم تشغيله في هذه الطريقة ليس جزءًا من واجهة المستخدم.تعد طريقة readDataFromCollider () فقط جزءًا من الواجهة. ماذا تفعل بهذه الأساليب "الداخلية" الأربعة؟ حق! تقييد الوصول إليهم باستخدام المُعدِّل الخاص. حتى يتمكنوا من القيام بعملهم بأمان داخل الفصل وعدم تضليل المستخدم الذي لا يحتاج إلى منطق كل منهم على حدة. فئة عامة ColliderUtil (قراءة DataFromCollider فارغة عامة (مسار pathToData) (مصادم بايت = readByteData (pathToData) ؛ String textData = convertBytesToSymbols (colliderData) ؛ ملف fileWithData = saveToFile (textData) ؛ printColliderData) (fileWyteData) // يقرأ البيانات بالبايت) تحويل السلسلة الخاصة BytesToSymbols (مصادم البايت DataInBytes) ( // يحول البايت إلى أحرف) ملف خاص saveToFile (String colliderData) ( // يحفظ بيانات القراءة في ملف) printColliderData الخاص باطل (ملف fileWithColliderData) ( // يطبع البيانات من ملف } }

معدل محمي

معدّل الوصول التالي الأقوى محمي.
الحقول والأساليب المعينة بمعدِّل الوصول المحمي ستكون مرئية:
  • ضمن جميع الفئات الموجودة في نفس الحزمة مثل مجموعتنا ؛
  • في جميع الفئات التي ترث من صفنا.
من الصعب أن نتخيل على الفور متى قد تكون هناك حاجة لذلك. لا تتفاجأ: هناك حالات استخدام محمية أقل بكثير من الحالات الخاصة ، وهي حالات محددة. تخيل أن لدينا فئة مجردة AbstractSecretAgent تشير إلى وكيل سري لبعض الخدمات الخاصة ، بالإضافة إلى حزمة top_secret التي تحتوي على هذه الفئة وورثتها. يتم توريث فئات الخرسانة منه - FBISecretAgent ، MI6SecretAgent ، MossadSecretAgent ، إلخ. داخل فئة abstract ، نريد تنفيذ عداد وكيل. عندما يتم إنشاء كائن وكيل جديد في مكان ما في البرنامج ، فإنه سينمو. حزمة top_secret ؛ فئة الملخص العامة AbstractSecretAgent (public static int agentCount = 0 ؛) لكن وكلائنا سريون! هذا يعني أنه يجب عليهم فقط معرفة رقمهم ولا أحد غيرهم. يمكننا بسهولة إضافة المُعدِّل المحمي إلى حقل agentCount ، ومن ثم يمكن لكائنات فئات أخرى من العملاء السريين ، أو تلك الفئات الموجودة في حزمة top_secret "السرية" الخاصة بنا ، الحصول على قيمتها. فئة الملخص العامة AbstractSecretAgent (المحمية static int agentCount = 0 ؛) لمثل هذه المهام المحددة ، يلزم استخدام المُعدِّل المحمي :)

حزمة تعديل مرئية

علاوة على ذلك ، فإن القائمة هي المُعدِّل الافتراضي ، أو كما يُطلق عليها أيضًا الحزمة المرئية. لا يتم الإشارة إليها بكلمة رئيسية حيث يتم تعيينها افتراضيًا في 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) لأول مرة في حياتك.
الآن بعد أن درست المحاضرات حول الواجهات ، غرضها واضح لك :) بعد كل شيء ، تم إنشاء الجمهور من أجل إعطاء شيء للمستخدمين. على سبيل المثال ، واجهة البرنامج الخاص بك. لنفترض أنك كتبت برنامج ترجمة ، ويمكنه ترجمة النص الروسي إلى اللغة الإنجليزية. لقد أنشأت طريقة ترجمة (String textInRussian) ، يتم من خلالها تنفيذ المنطق الضروري. لقد قمت بتمييز هذه الطريقة بالكلمة عام ، وستصبح الآن جزءًا من الواجهة: مترجم فئة عامة (ترجمة سلسلة عامة (سلسلة نصية باللغة الروسية) ( // ترجمة النص من الروسية إلى الإنجليزية)) يمكنك ربط استدعاء هذه الطريقة بالزر "ترجمة" على شاشة البرنامج - وهذا كل شيء! يمكن لأي شخص استخدامه. أجزاء من التعليمات البرمجية التي تم تمييزها بالمعدِّل العام مخصصة للمستخدم النهائي. لإعطاء مثال من واقع الحياة ، الخصوصية هي جميع العمليات التي تتم داخل التلفزيون أثناء تشغيله ، والعامة هي الأزرار الموجودة على جهاز التحكم عن بُعد الخاص بالتلفزيون والتي يمكن للمستخدم التحكم بها. في الوقت نفسه ، لا يحتاج إلى معرفة كيفية عمل التلفزيون وكيف يعمل. جهاز التحكم عن بعد عبارة عن مجموعة من الطرق العامة: on () ، off () ، nextChannel () ، previousChannel () ، expandVolume () ، انخفاض الحجم () ، إلخ.

توفر لغة 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 ثم استخدامها في هذه البرامج.