لماذا يتم تصميم آلية التحكم في الوصول في Java؟ هناك وظيفتان رئيسيتان:
(1) لكي يتجنب المستخدمون لمس قطع الغيار التي يجب ألا يلمسها ، فإن هذه الأجزاء ضرورية للعمليات الداخلية ، لكنها ليست جزءًا من الواجهة المطلوبة من قبل مبرمج العميل.
(2) من أجل تمكين مصممي مكتبة الصف من تغيير الأعمال الداخلية للفئات دون القلق بشأن تأثير كبير على المستخدمين.
مستوى التحكم في إذن الوصول في جافا هو:
عام -> محمي -> وصول الحزمة (لا يوجد معدل إذن) -> خاص.
1. الحزمة
يشبه مفهوم الحزم في Java مفهوم مساحات الأسماء في C ++ ، وكلاهما يمكن أن يحد من نطاق الفئات. الفرق الأكبر بين الاثنين هو أن الحزم في Java تشير ضمنيًا إلى التسلسل الهرمي للشجرة للفئة (وكذلك بنية دليل رمز مصدر Java). ميزة ذلك هي أن تفرد الفصل يمكن تقييده بمتطلبات تفرد مسار الملف في نظام الملفات.
1. تنظيم الكود
عند كتابة ملف رمز مصدر Java (ملف .java) ، عادة ما يسمى هذا الملف وحدة تجميع. في معظم الأحيان ، يُسمح بالفئة العامة الواحدة في وحدة التجميع ، ويجب أن يكون اسم الفصل هو نفس اسم الملف (بما في ذلك الحالة العلوية والسفلية).
عند تجميع ملف .java ، سيكون لكل فئة في ملف .java ملف إخراج .class ، واسم الملف واسم الفئة متماثلان. برنامج Java Runable هو مجموعة من ملفات .class التي يمكن تعبئتها وضغطها في ملف مستند Java (حزمة JAR ، باستخدام مولد مستند Java's Jar). مترجم Java مسؤول عن البحث وتحميل وتفسير هذه الملفات.
مكتبة الفصل هي في الواقع مجموعة من ملفات الفصل. يُسمح لكل ملف .java أن يكون لديه فئة عامة واحدة على الأكثر ، وكذلك أي عدد من الفصول غير العامة. لذلك ، كل ملف له قطعة أثرية. إذا كنت ترغب في تنظيم هذه المكونات (لكل بناء ملف .java وعدة ملفات .class) لتشكيل مجموعات مختلفة ، يمكنك استخدام حزمة الكلمات الرئيسية في Java.
2. وظيفة الحزمة
(1) تنظيم فئات أو واجهات ذات وظائف متشابهة أو ذات صلة في نفس الحزمة لتسهيل البحث واستخدام الفئات.
(2) مثل المجلدات ، تستخدم الحزم أيضًا أدلة على شكل شجرة لتخزينها. أسماء الفصول في نفس الحزمة مختلفة ، ويمكن أن تكون أسماء الفئات في حزم مختلفة هي نفسها. عندما يتم استدعاء الفصول التي تحمل اسم الفئة نفسها في حزمتين مختلفتين في نفس الوقت ، يجب إضافة اسم الحزمة لتمييزهما. لذلك ، يمكن للحزمة تجنب تعارضات الاسم.
(3) الحزم أيضا تحد من حقوق الوصول. يمكن فقط للفصول التي لديها حقوق الوصول إلى الحزمة الوصول إلى الفصول في الحزمة.
3. إنشاء حزمة
في Java ، استخدم الكلمة الرئيسية الحزمة لتحديد الحزمة (مساحة الاسم) التي ينتمي إليها الرمز.
تنسيق بناء الجملة:
حزمة PKG1 [. PKG2 [. PKG3 ...]] ؛
ملحوظة:
(1) يشير اسم الحزمة ضمنيًا إلى بنية الدليل للرمز.
(2) يجب أن يكون اسم الفئة العامة (أيضًا اسم ملف Java) في نفس الدليل فريدًا.
(3) يجب أن يكون إعلان الحزمة على السطر الأول من الملف المصدر. يمكن أن يكون لكل ملف مصدر إعلان حزمة واحد فقط ، ويتم تطبيق كل نوع في هذا الملف عليه.
(4) إذا لم يستخدم ملف مصدر إعلان الحزمة ، فسيتم وضع الفئات والوظائف والتعليقات والتعليقات ، إلخ. في حزمة لم يكشف عن اسمها.
(5) أسماء الحزم عمومًا في أحرف صغيرة.
على سبيل المثال:
تحقق من رمز المصدر لفئة java.util.arraylist ويمكنك أن ترى أن السطر الأول من الملف هو:
حزمة java.util ؛
هيكل دليل الكود الخاص به هو Java/Util/ArrayList.java
4. حزمة الاستيراد
في Java ، استخدم الكلمة الرئيسية للاستيراد لاستيراد الحزم.
تنسيق بناء الجملة:
package repare1 [.package2 ...]. (className |*) ؛
مثال:
لنأخذ java.util.arraylist كمثال. من غير المريح للغاية استخدامه بطريقة تحتوي على مسار طبقي كامل.
java.util.arraylist <string> list = new java.util.arraylist <string> () ؛
إذا كنت ترغب في حذف المسار السابق ، فيمكنك استخدام الكلمة الرئيسية للاستيراد.
استيراد java.util.arraylist ؛
بعد استيراد الحزمة في الملف ، يمكن تبسيط الكود السابق الذي يعلن أن القائمة على النحو التالي:
ArrayList <string> list = new ArrayList <String> () ؛
2. معدلات حقوق الوصول
1. الحزمة: أذونات الوصول إلى الحزمة
إذا لم يتم توفير معدل وصول ، فهذا يعني أنه يتم الوصول إلى الحزمة.
لا يحتوي الوصول الافتراضي على كلمات رئيسية ، ولكنه يشير عادةً إلى الوصول إلى الحزمة (أحيانًا يتم التعبير عنه أيضًا على أنه ودود ، يشبه إلى حد ما مفهوم عناصر الأصدقاء في C ++). هذا يعني أنه يمكن لجميع الفئات الأخرى في الحزمة الوصول إلى هذا العضو أو الطريقة ، ولكن لا يمكن الوصول إلى جميع الفئات خارج هذه الحزمة.
مثال:
com.notes.packages.test.info
package com.notes.packages.test ؛ publicclass info {void print () {system.out.println ("method default - print ()") ؛ }}com.notes.packages.test.publicdemo01
package com.notes.packages.test ؛ publicClass publicDemo01 {publicstaticvoid main (string [] args) {info x = new info () ؛ x.print () ؛ }}يمكن لـ PublicDemo01 والمعلومات الوصول إلى طريقة المعلومات الافتراضية - print () ضمن نفس الحزمة.
com.notes.packages.publicdemo02
package com.notes.packages ؛ import com.notes.packages.test.info ؛ publicClass publicDemo02 {publicstaticvoid main (string [] args) {info x = new info () ؛ // x.print () ؛ // خطأ }}PublicDemo02 والمعلومات ليست في نفس الحزمة ، ولا يمكن الوصول إلى طريقة إذن الوصول إلى حزمة Info - Print ().
2. الجمهور: أذونات الوصول إلى الواجهة
يعني استخدام الكلمة الرئيسية العامة أن العضو أو الطريقة المعلنة في متناول الجميع.
مثال: إذا تم تعيين إذن طريقة Print () في مثال إذن المستوى الافتراضي على الأماكن العامة ، فيمكن الوصول إلى PublicDemo02.
package com.notes.packages.test ؛ publicclass info {publicvoid print () {system.out.println ("public method - print ()") ؛ }}3. الخاص: غير قادر على الوصول
يعني استخدام الكلمة الرئيسية الخاصة أن العضو أو الطريقة المعلنة لا يمكن الوصول إليها لأي فئة أخرى باستثناء هذه الفئة.
سيناريو التطبيق: وضع المفرد
4. محمية: أذونات الوصول الموروثة
يمكن لفئة جديدة (تسمى فئة الطفل أو فئة مشتقة) إعادة استخدام فئة موجودة (تسمى فئة الوالدين أو فئة أساسية) من خلال الميراث ، ثم تمديد أعضاء وطرق الفئة الأساسية. في بعض الأحيان ، سيريد منشئ الفئة الأساسية عضوًا معينًا لتعيين وصوله إلى الفصل المشتق بدلاً من جميع الفئات. لا يمكن للجمهور القيام بذلك ، ولهذا الغرض ، تم تقديم حماية للقيام بهذه المهمة. يوفر المحمية أيضًا الوصول إلى الحزمة ، أي الفئات المشتقة والفئات الأخرى داخل نفس الحزمة يمكنها الوصول إلى الأعضاء أو الأساليب المحمية.
مثال: بعد أن ترث الفئة الفرعية الفئة الأصل ، يمكنها الوصول إلى الأعضاء المحميين في الفئة الأصل.
فئة الأب {private string a = "private" ؛ سلسلة محمية B = "محمية" ؛ السلسلة العامة C = "public" ؛} ؛ يمتد الابن الفئة الأب {publicvoid print () {// system.out.println ("element a:" + super.a) ؛ // error system.out.println ("Element B:" + super.b) ؛ System.out.println ("Element C:" + super.c) ؛ }} publicClass protectedDemo01 {publicStaticVoid Main (String args []) {son sub = new son () ؛ sub.print () ؛ }} ؛ملاحظات على معدلات الوصول
في الأمثلة السابقة ، يمكن تعديل الأعضاء وطرق الفصل مع معدلات الإذن المختلفة.
بالإضافة إلى ذلك ، هناك بعض النقاط للانتباه إلى:
(1) استخدام معدلات الإذن للأعضاء الثابتة والأساليب الثابتة هو نفس استخدام الأعضاء والأساليب العادية.
(2) على الرغم من أنه يمكن أيضًا تعديل الفصل بواسطة المعدلات ، إلا أنه لا يمكن استخدام كلمتين خطابين خاصين ومحميين.
(3) في بعض الكتب ، يسمى الوصول إلى الحزمة أيضًا الوصول الافتراضي. أنا شخصياً لا أوصي بحفظ بهذه الطريقة ، لأن هذا يتم الخلط بسهولة مع الميزة الجديدة لـ Java SE8 - الكلمة الرئيسية الافتراضية. لا يمكن استخدام هذه الكلمة الرئيسية إلا للواجهة ، وتتمثل وظيفتها في السماح للمبرمجين بتحديد التنفيذ الافتراضي للواجهات في الواجهة (في إصدارات JDK السابقة لم تسمح بذلك ، يمكنك فقط إعلان الطرق في الواجهة).
ما سبق هو كل شيء عن هذا المقال ، آمل أن يكون مفيدًا لتعلم الجميع.