ما الفرق بين القطاع العام والمحمي والحزمة الخاصة والخاصة في Java؟

StackOverflow https://stackoverflow.com/questions/215497

سؤال

في Java، هل توجد قواعد واضحة بشأن متى يتم استخدام كل معدّل من معدّلات الوصول، وتحديدًا الإعداد الافتراضي (الحزمة الخاصة)، public, protected و private, ، أثناء صنع class و interface والتعامل مع الميراث؟

هل كانت مفيدة؟

المحلول

البرنامج التعليمي الرسمي قد يكون من بعض استخدام لكم .

            │ Class │ Package │ Subclass │ Subclass │ World
            │       │         │(same pkg)│(diff pkg)│ 
────────────┼───────┼─────────┼──────────┼──────────┼────────
public      │   +   │    +    │    +     │     +    │   +     
────────────┼───────┼─────────┼──────────┼──────────┼────────
protected   │   +   │    +    │    +     │     +    │         
────────────┼───────┼─────────┼──────────┼──────────┼────────
no modifier │   +   │    +    │    +     │          │    
────────────┼───────┼─────────┼──────────┼──────────┼────────
private     │   +   │         │          │          │    

 + : accessible         blank : not accessible

نصائح أخرى

و(تحذير: أنا لست مبرمج جافا، أنا مبرمج بيرل بيرل لا يوجد لديه الحماية الرسمية التي ربما كان هذا السبب أنا أفهم المشكلة على ما يرام :)).

خاص

ومثل كنت اعتقد، فقط على الفئة في الذي أعلن أنه يمكن أن نرى ذلك.

حزمة الخاصة

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

المحمية

يمكن أن ينظر إليه

وحزمة الخاصة + التي كتبها فرعية أو عضو الحزمة.

عام

ويمكن للجميع رؤيتها.

نشرت

ومرئي خارج رمز I السيطرة عليها. (في حين لا تركيب جافا، فإنه من المهم لهذه المناقشة).

وC ++ يحدد مستوى إضافي يسمى "صديق" وأقل تعرفه عن أن نحو الأفضل.

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

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

إذا كنت تريد للمستخدمين لتكون قادرة على تخصيص السلوكيات، بدلا من جعل الداخلية الجمهور حتى يتمكنوا من تجاوز منهم، انها غالبا ما تكون فكرة أفضل ليشق تلك الشجاعة إلى كائن وجعل تلك الواجهة الجمهور. وبهذه الطريقة يمكن سد العجز ببساطة في كائن جديد. على سبيل المثال، إذا كنت تكتب لاعب CD وأراد "تذهب تجد من المعلومات حول هذا القرص المضغوط" قليلا للتخصيص، بدلا من جعل تلك الأساليب الجمهور وكنت وضعت جميع هذه الوظيفة في الكائن الخاص بها وجعل مجرد الخاص بك الكائن جالبة / واضعة الجمهور . وبهذه الطريقة بالبخل عن تعريض الشجاعة الخاص تشجع تكوين جيد وفصل الاهتمامات

وشخصيا، أنا عصا فقط مع "الخاص" و "العام". العديد من اللغات OO يكون مجرد ذلك. "المحمية" يمكن أن تكون في متناول اليد، لكنها في الحقيقة رجل غشاش. مرة واحدة واجهة هي أكثر من خاصة انها خارج عن سيطرتك وعليك أن تذهب تبحث في التعليمات البرمجية الآخرين لإيجاد استخدامات.

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

والعديد من اللغات العثور على الطبيعة الهرمية للجمهور / حماية / خاصة أن الحد من ولا يتماشى مع الواقع. ولتحقيق هذه الغاية هناك مفهوم الطبقة سمة ، ولكن هذا عرض آخر.

وهنا نسخة أفضل من الجدول.(دليل المستقبل مع عمود للوحدات النمطية.)

Java Access Modifiers

تفسيرات

  • أ خاص عضو (i) يكون فقط يمكن الوصول إليها داخل نفس الفئة كما تم الإعلان عنها.

  • عضو مع لا يوجد معدل الوصول (j) لا يمكن الوصول إليه إلا ضمن الفئات الموجودة في نفس الحزمة.

  • أ محمي عضو (k) يمكن الوصول إليه من خلال جميع الفئات في نفس الحزمة و ضمن الفئات الفرعية في الحزم الأخرى.

  • أ عام عضو (l) يمكن الوصول إليه لجميع الفئات (ما لم يكن موجودًا في ملف وحدة لا يقوم بتصدير الحزمة التي تم الإعلان عنها فيها).


أي معدل تختار؟

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

أمثلة:

  • حقل long internalCounter من المحتمل أن تكون خاصة لأنها قابلة للتغيير وتفاصيل التنفيذ.
  • يجب أن تحتوي الفئة التي يجب إنشاء مثيل لها فقط في فئة المصنع (في نفس الحزمة) على مُنشئ مقيد للحزمة، حيث لا ينبغي أن يكون من الممكن استدعاؤها مباشرة من خارج الحزمة.
  • داخلي void beforeRender() يجب حماية الطريقة التي يتم استدعاؤها مباشرة قبل العرض واستخدامها كخطاف في الفئات الفرعية.
  • أ void saveGame(File dst) يجب أن تكون الطريقة التي يتم استدعاؤها من كود واجهة المستخدم الرسومية عامة.

(*) ما هو التغليف بالضبط؟

                | highest precedence <---------> lowest precedence
*———————————————+———————————————+———————————+———————————————+———————
 \ xCanBeSeenBy | this          | any class | this subclass | any
  \__________   | class         | in same   | in another    | class
             \  | nonsubbed     | package   | package       |    
Modifier of x \ |               |           |               |       
————————————————*———————————————+———————————+———————————————+———————
public          |       ✔       |     ✔     |       ✔       |   ✔   
————————————————+———————————————+———————————+———————————————+———————
protected       |       ✔       |     ✔     |       ✔       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
package-private |               |           |               |
(no modifier)   |       ✔       |     ✔     |       ✘       |   ✘   
————————————————+———————————————+———————————+———————————————+———————
private         |       ✔       |     ✘     |       ✘       |   ✘    

وحكم سهلة. تبدأ مع إعلان كل شيء خاص. ثم تقدم نحو الجمهور كما دعت الاحتياجات وتصميم مذكرات ذلك.

وعندما يسأل أعضاء تعريض نفسك إذا كنت تعريض الخيارات التمثيل أو الخيارات التجريد. أول شيء كنت ترغب في تجنب لأنها سوف يعرض الكثير من تبعيات على التمثيل الفعلي وليس على سلوكها يمكن ملاحظتها.

وكقاعدة عامة أحاول تجنب تجاوز تطبيقات الطريقة التي شاء subclasses ترث. فمن السهل جدا أن المسمار المنطق. أعلن طرق حماية مجردة إذا كنت تنوي من أجل أن يتم تجاوز.

وبالإضافة إلى ذلك، استخدام الشرحOverride عندما تجاوز لابقاء الامور من كسر عند ريفاكتور.

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

يُطلق أيضًا على الوصول "الافتراضي" (المحدد بسبب عدم وجود كلمة رئيسية). حزمة خاصة.استثناء:في الواجهة، لا يوجد أي معدل يعني الوصول العام؛المعدلات الأخرى غير العامة محظورة.ثوابت التعداد تكون دائمًا عامة.

ملخص

هل يُسمح بالوصول إلى عضو لديه محدد الوصول هذا؟

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

ما تنطبق عليه محددات الوصول

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

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

جميع محددات الوصول ممكنة على أعضاء الفصل (المنشئون والأساليب ووظائف الأعضاء الثابتة والفئات المتداخلة).

متعلق ب: إمكانية الوصول إلى فئة جافا

طلب

يمكن ترتيب محددات الوصول بدقة

عام > محمي > الحزمة خاصة > خاص

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

ملحوظات

  • أساليب الطبقة نكون يُسمح بالوصول إلى أعضاء خاصين من كائنات أخرى من نفس الفئة. بتعبير أدق، يمكن لطريقة من الفئة C الوصول إلى أعضاء خاصين من C على كائنات من أي فئة فرعية من C.لا تدعم Java تقييد الوصول حسب المثيل، فقط حسب الفئة.(قارن مع Scala، الذي يدعم استخدامه private[this].)
  • تحتاج إلى الوصول إلى مُنشئ لإنشاء كائن.وبالتالي، إذا كانت جميع المنشئات خاصة، فلا يمكن إنشاء الفئة إلا عن طريق التعليمات البرمجية الموجودة داخل الفئة (عادةً أساليب المصنع الثابتة أو مُهيئات المتغير الثابت).وبالمثل بالنسبة لمنشئي الحزمة الخاصة أو المحمية.
    • إن وجود مُنشئات خاصة فقط يعني أيضًا أنه لا يمكن تصنيف الفئة فرعية خارجيًا، نظرًا لأن Java تتطلب من مُنشئي الفئة الفرعية أن يستدعوا مُنشئ الفئة الفائقة بشكل ضمني أو صريح.(ومع ذلك، يمكن أن تحتوي على فئة متداخلة تصنفها ضمن فئات فرعية.)

الطبقات الداخلية

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

ومع ذلك، فإن هذا أمر معقد للغاية، وللحصول على التفاصيل الكاملة، راجع مواصفات لغة جافا.(نعم، كانت هناك أخطاء في المترجم في الماضي.)

للحصول على فكرة عن كيفية تفاعل هذه العناصر، فكر في هذا المثال.من الممكن "تسريب" الطبقات الداخلية الخاصة؛هذا عادة تحذير:

class Test {
    public static void main(final String ... args) {
        System.out.println(Example.leakPrivateClass()); // OK
        Example.leakPrivateClass().secretMethod(); // error
    }
}

class Example {
    private static class NestedClass {
        public void secretMethod() {
            System.out.println("Hello");
        }
    }
    public static NestedClass leakPrivateClass() {
        return new NestedClass();
    }
}

إخراج المترجم:

Test.java:4: secretMethod() in Example.NestedClass is defined in an inaccessible class or interface
        Example.leakPrivateClass().secretMethod(); // error
                                  ^
1 error

بعض الأسئلة ذات الصلة:

شئ متعارف عليه:

  • private:نطاق الطبقة.
  • default (أو package-private):نطاق الحزمة.
  • protected: package scope + child (مثل الحزمة، ولكن يمكننا تصنيفها فرعيًا من حزم مختلفة).يحتفظ المُعدِّل المحمي دائمًا بالعلاقة "بين الوالدين والطفل".
  • public:في كل مكان.

ونتيجة لذلك، إذا قسمنا حق الوصول إلى ثلاثة حقوق:

  • (مباشر (استدعاء من أسلوب داخل نفس الفئة، أو عبر بناء جملة "هذا").
  • (مرجع (استدعاء طريقة باستخدام مرجع للفئة، أو عبر بناء جملة "نقطة").
  • (ميراث (عبر التصنيف الفرعي).

ثم لدينا هذا الجدول البسيط:

+—-———————————————+————————————+———————————+
|                 |    Same    | Different |
|                 |   Package  | Packages  |
+—————————————————+————————————+———————————+
| private         |   D        |           |
+—————————————————+————————————+———————————+
| package-private |            |           |
| (no modifier)   |   D R I    |           |
+—————————————————+————————————+———————————+
| protected       |   D R I    |       I   |
+—————————————————+————————————+———————————+
| public          |   D R I    |    R  I   |
+—————————————————+————————————+———————————+

باختصار شديد

  • public:يمكن الوصول إليها من كل مكان.
  • protected:يمكن الوصول إليها من خلال فئات نفس الحزمة والفئات الفرعية الموجودة في أي حزمة.
  • الافتراضي (لم يتم تحديد أي معدل):يمكن الوصول إليها من خلال فئات نفس الحزمة.
  • private:يمكن الوصول إليها داخل نفس الفئة فقط.

أكثر معدلات الوصول التي يساء فهمها في Java هي protected.نحن نعلم أنه يشبه المُعدِّل الافتراضي مع استثناء واحد يمكن للفئات الفرعية رؤيته فيه.ولكن كيف؟فيما يلي مثال نأمل أن يوضح الارتباك:

  • لنفترض أن لدينا فئتين؛ Father و Son, ، كل في حزمته الخاصة:

    package fatherpackage;
    
    public class Father
    {
    
    }
    
    -------------------------------------------
    
    package sonpackage;
    
    public class Son extends Father
    {
    
    }
    
  • دعونا نضيف طريقة محمية foo() ل Father.

    package fatherpackage;
    
    public class Father
    {
        protected void foo(){}
    }
    
  • طريقة foo() يمكن استدعاؤها في 4 سياقات:

    1. داخل الفصل الموجود في نفس الحزمة حيث foo() ويعرف (fatherpackage):

      package fatherpackage;
      
      public class SomeClass
      {
          public void someMethod(Father f, Son s)
          {
              f.foo();
              s.foo();
          }
      }
      
    2. داخل فئة فرعية، في المثيل الحالي عبر this أو super:

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod()
          {
              this.foo();
              super.foo();
          }
      }
      
    3. على مرجع نوعه هو نفس الفئة:

      package fatherpackage;
      
      public class Father
      {
          public void fatherMethod(Father f)
          {
              f.foo(); // valid even if foo() is private
          }
      }
      
      -------------------------------------------
      
      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Son s)
          {
              s.foo();
          }
      }
      
    4. على مرجع نوعه هو الفئة الأصل وهو كذلك داخل الحزمة حيث foo() ويعرف (fatherpackage) [يمكن تضمين هذا داخل السياق رقم.1]:

      package fatherpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo();
          }
      }
      
  • الحالات التالية غير صالحة.

    1. على مرجع نوعه هو الفئة الأصل وهو كذلك الخارج الحزمة حيث foo() ويعرف (fatherpackage):

      package sonpackage;
      
      public class Son extends Father
      {
          public void sonMethod(Father f)
          {
              f.foo(); // compilation error
          }
      }
      
    2. فئة غير فرعية داخل حزمة فئة فرعية (ترث الفئة الفرعية الأعضاء المحميين من الفئة الأم، وتجعلهم خاصين لغير الفئات الفرعية):

      package sonpackage;
      
      public class SomeClass
      {
          public void someMethod(Son s) throws Exception
          {
              s.foo(); // compilation error
          }
      }
      

خاص

  • الأساليب والمتغيرات والمنشئات

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

  • الطبقة والواجهة

معدّل الوصول الخاص هو مستوى الوصول الأكثر تقييدًا.لا يمكن أن تكون الفئة والواجهات خاصة.

ملحوظة

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


محمي

  • الطبقة والواجهة

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

يمكن إعلان الطرق والحقول محمية، ولكن لا يمكن إعلان الطرق والحقول في الواجهة محمية.

ملحوظة

يمنح الوصول المحمي الفئة الفرعية فرصة لاستخدام الأسلوب المساعد أو المتغير، مع منع فئة غير مرتبطة من محاولة استخدامه.


عام

يمكن الوصول إلى فئة أو طريقة أو منشئ أو واجهة وما إلى ذلك للعامة المعلنة من أي فئة أخرى.

لذلك يمكن الوصول إلى الحقول والأساليب والكتل المعلنة داخل فئة عامة من أي فئة تنتمي إلى Java Universe.

  • حزم مختلفة

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

بسبب وراثة الفئة، يتم وراثة جميع الأساليب والمتغيرات العامة للفئة من خلال فئاتها الفرعية.


الافتراضي -لا توجد كلمة رئيسية:

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

  • ضمن نفس الباقات

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

ملحوظة

لا يمكننا تجاوز الحقول الثابتة. إذا حاولت تجاوزها ، فهذا لا يظهر أي خطأ ولكنه لا يعمل ما نحن باستثناء.

الإجابات ذات الصلة

روابط المراجع

http://docs.Oracle.com/javase/tutorial/Java/JavaOO/accesscontrol.html http://www.tutorialspoint.com/java/Java_access_modifiers.htm

<القوي> خاص : في محدودية الوصول إلى الدرجة فقط

<القوي> افتراضي (أي معدل) : لمحدودية الوصول إلى الصف وحزمة

على المحمية : لمحدودية الوصول إلى الصف، حزمة والفئات الفرعية (داخل وخارج الحزمة)

<قوية> عام : في. يمكن الوصول إلى الصف، حزمة (جميع)، والفئات الفرعية ... وباختصار، في كل مكان

ويمكن الاطلاع على الفرق في الروابط الموجودة بالفعل ولكن أي واحد لاستخدام عادة يأتي الى "مبدأ اقل المعرفة". تسمح الا تقل عن رؤية ما هو مطلوب.

توجد معدّلات الوصول لتقييد الوصول على عدة مستويات.

عام: إنها في الأساس بسيطة كما يمكنك الوصول إليها من أي فئة سواء كانت في نفس الحزمة أم لا.

للوصول إذا كنت في نفس الحزمة، يمكنك الوصول مباشرة، ولكن إذا كنت في حزمة أخرى، فيمكنك إنشاء كائن من الفئة.

تقصير: يمكن الوصول إليه في نفس الحزمة من أي فئة من فئات الحزمة.

للوصول يمكنك إنشاء كائن من الفئة.لكن لا يمكنك الوصول إلى هذا المتغير خارج الحزمة.

محمي: يمكنك الوصول إلى المتغيرات في نفس الحزمة وكذلك الفئة الفرعية في أي حزمة أخرى.هذا هو الحال في الأساس الافتراضي + الموروثة سلوك.

للوصول إلى الحقل المحمي المحدد في الفئة الأساسية، يمكنك إنشاء كائن من الفئة الفرعية.

خاص: يمكن الوصول إليه في نفس الفصل.

في الطرق غير الثابتة يمكنك الوصول مباشرة بسبب هذا مرجع (أيضًا في المنشئات) ولكن للوصول بطرق ثابتة تحتاج إلى إنشاء كائن من الفئة.

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

تُستخدم معدّلات الوصول إلى Java لتوفير التحكم في الوصول في Java.

1.تقصير:

يمكن الوصول إليها للفئات في نفس الحزمة فقط.

على سبيل المثال،

// Saved in file A.java
package pack;

class A{
  void msg(){System.out.println("Hello");}
}

// Saved in file 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
  }
}

وهذا الوصول مقيد أكثر من الوصول العام والمحمي، ولكنه أقل تقييدًا من الوصول الخاص.

2.عام

يمكن الوصول إليها من أي مكان.(الوصول العالمي)

على سبيل المثال،

// Saved in file A.java

package pack;
public class A{
  public void msg(){System.out.println("Hello");}
}

// Saved in file B.java

package mypack;
import pack.*;

class B{
  public static void main(String args[]){
    A obj = new A();
    obj.msg();
  }
}

الإخراج: مرحبا

3.خاص

يمكن الوصول إليها فقط داخل نفس الفئة.

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

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
  }
}

4.محمي

يمكن الوصول إليه فقط للفئات الموجودة في نفس الحزمة والفئات الفرعية

على سبيل المثال،

// Saved in file A.java
package pack;
public class A{
  protected void msg(){System.out.println("Hello");}
}

// Saved in file B.java
package mypack;
import pack.*;

class B extends A{
  public static void main(String args[]){
    B obj = new B();
    obj.msg();
  }
}

انتاج:مرحبًا

Enter image description here

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

  • الأنواع غير الأعضاء (أي الفئات والتعدادات والواجهات وأنواع التعليقات التوضيحية غير المعلنة داخل نوع آخر) تكون خاصة بالحزمة افتراضيًا.(JLS §6.6.1)

  • يكون أعضاء الفصل والمنشئون خاصين بالحزمة بشكل افتراضي.(JLS §6.6.1)

  • منشئو التعداد هم خاصة بشكل افتراضي.(في الواقع، منشئي التعداد يجب تكون خاصة، ومن الخطأ محاولة جعلها عامة أو محمية).ثوابت التعداد عامة، ولا تسمح بأي محدد وصول.الأعضاء الآخرون في التعدادات يكونون حزمة خاصة افتراضيًا.(JLS §8.9)

  • جميع أعضاء الواجهات وأنواع التعليقات التوضيحية العامة بشكل افتراضي.(في الواقع، أعضاء الواجهات وأنواع التعليقات التوضيحية يجب تكون عامة، ومن الخطأ محاولة جعلها خاصة أو محمية.) (JLS §9.3 إلى 9.5)

  • عام - يمكن الوصول إليها من أي مكان في التطبيق.

  • تقصير - يمكن الوصول إليها من الحزمة.

  • محمي - يمكن الوصول إليها من الحزمة والفئات الفرعية في الحزمة الأخرى.أيضًا

  • خاص - يمكن الوصول إليها من فئتها فقط.

مرئية للحزمة.الافتراضي.ليست هناك حاجة إلى المعدلات.

مرئي للفصل الدراسي فقط (خاص).

مرئية للعالم (عام).

مرئية للحزمة وجميع الفئات الفرعية (محمي).

يمكن الإعلان عن المتغيرات والأساليب دون استدعاء أية معدلات.الأمثلة الافتراضية:

String name = "john";

public int age(){
    return age;
}

معدّل الوصول الخاص - خاص:

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

يمكن الوصول إلى المتغيرات التي تم إعلانها خاصة خارج الفصل في حالة وجود أساليب getter العامة في الفصل.

يعد استخدام المعدل الخاص هو الطريقة الرئيسية التي يقوم بها الكائن بتغليف نفسه وإخفاء البيانات من العالم الخارجي.

أمثلة:

Public class Details{

    private String name;

    public void setName(String n){
        this.name = n;
    }

    public String getName(){
        return this.name;
    }
}

معدّل الوصول العام - عام:

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

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

بسبب وراثة الفئة، يتم وراثة جميع الأساليب والمتغيرات العامة للفئة من خلال فئاتها الفرعية.

مثال:

public void cal(){

}

معدّل الوصول المحمي - محمي:

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

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

يمنح الوصول المحمي الفئة الفرعية فرصة لاستخدام الأسلوب المساعد أو المتغير، مع منع فئة غير مرتبطة من محاولة استخدامه.

class Van{

    protected boolean speed(){

    }
}

class Car{
    boolean speed(){
    }

}

هذه الصفحة يكتب جيدا حول المحمية و الافتراضي وصول معدل

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

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

والجواب داود توفر معنى كل معدل الوصول. أما بالنسبة متى تستخدم كل، أنا أقترح جعل الجمهور جميع الطبقات وطرق كل فئة التي تهدف للاستخدام الخارجي (API الخاصة به)، وكل شيء خاص.

وبمرور الوقت سوف تنمية الشعور لحين إجراء بعض الطبقات حزمة خاصة، وعندما يعلن بعض وسائل حماية للاستخدام في الفئات الفرعية.

ملحوظة: هذا مجرد ملحق للإجابة المقبولة.

هذا مرتبط بجافا معدّلات الوصول.

من معدلات الوصول إلى جافا:

يحدد معدل Access Java الفئات التي يمكنها الوصول إلى فئة معينة وحقولها ومشاركاتها وأساليبها.يمكن تحديد معدلات الوصول بشكل منفصل لفئة ما ، ومقدماته ، والحقول والأساليب.يشار أحيانًا إلى معدلات الوصول إلى Java في الكلام اليومي كحديدات الوصول إلى Java ، ولكن الاسم الصحيح هو معدلات Access Java.يمكن أن تحتوي الفصول والحقول والمقدمات والأساليب على واحد من أربع معدلات وصول Java المختلفة:

  • قائمة الاغراض
  • خاص
  • الافتراضي (الحزمة)
  • محمي
  • عام

من التحكم في الوصول إلى أعضاء الفصل دروس:

تحدد معدلات مستوى الوصول ما إذا كانت الفئات الأخرى يمكنها استخدام حقل معين أو استدعاء طريقة معينة.هناك مستويان من التحكم في الوصول:

  • في المستوى الأعلى — عام أو خاص بالحزمة (لا يوجد مُعدِّل صريح).
  • على مستوى الأعضاء — عام أو خاص أو محمي أو خاص بالحزمة (لا يوجد معدل صريح).

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

يوضح الجدول التالي الوصول إلى الأعضاء المسموح به من قبل كل معدل.

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ Modifier    ║ Class ║ Package ║ Subclass ║ World ║
╠═════════════╬═══════╬═════════╬══════════╬═══════╣
║ public      ║ Y     ║ Y       ║ Y        ║ Y     ║
║ protected   ║ Y     ║ Y       ║ Y        ║ N     ║
║ no modifier ║ Y     ║ Y       ║ N        ║ N     ║
║ private     ║ Y     ║ N       ║ N        ║ N     ║
╚═════════════╩═══════╩═════════╩══════════╩═══════╝

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

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

يعد القطاعان الافتراضي المحمي العام والخاص معدّلات الوصول.

وهي مخصصة للتغليف أو إخفاء محتويات الفصل وإظهارها.

  1. يمكن أن تكون الفئة عامة أو افتراضية
  2. يمكن أن يكون أعضاء الفصل عامًا أو محميًا أو افتراضيًا أو خاصًا.

لا يمكن الوصول إلى الخاص خارج الفصل الافتراضي في الفصل فقط في الحزمة.محمي في الحزمة وكذلك أي فئة تمتد إليها.العام مفتوح للجميع.

عادة، يتم تعريف متغيرات الأعضاء بأنها خاصة، ولكن أساليب الأعضاء تكون عامة.

لقد أدركت في كثير من الأحيان أن تذكر المفاهيم الأساسية لأي لغة يمكن أن يصبح ممكنًا من خلال إنشاء تشبيهات في العالم الحقيقي.فيما يلي تشبيهي لفهم معدّلات الوصول في Java:

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

  • عندما تحضره إلى الحرم الجامعي، أول شيء تراه أنت وصديقك هو هذا التمثال.وهذا يعني أن أي شخص يمشي في الحرم الجامعي يمكنه أن ينظر إلى التمثال دون إذن الجامعة.وهذا يجعل التمثال كما عام.

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

  • يريد صديقك تسجيل الدخول إلى شبكة WiFi في الحرم الجامعي ولكن ليس لديه أي بيانات اعتماد للقيام بذلك.الطريقة الوحيدة التي يمكنه من خلالها الاتصال بالإنترنت هي مشاركة معلومات تسجيل الدخول الخاصة بك معه.(تذكر أن كل طالب يذهب إلى الجامعة يمتلك أيضًا بيانات اعتماد تسجيل الدخول هذه).وهذا من شأنه أن يجعل بيانات اعتماد تسجيل الدخول الخاصة بك كما لا يوجد معدل.

  • أخيرًا، يريد صديقك قراءة تقرير التقدم الخاص بك للفصل الدراسي والذي تم نشره على الموقع.ومع ذلك، كل طالب لديه تسجيل الدخول الشخصي الخاص به للوصول إلى هذا القسم من موقع الحرم الجامعي.وهذا من شأنه أن يجعل أوراق الاعتماد هذه خاص.

أتمنى أن يساعدك هذا!

عندما تفكر في معدّلات الوصول، فكر في الأمر بهذه الطريقة (ينطبق على كليهما المتغيرات و طُرق):

public --> يمكن الوصول إليها من كل مكان
private --> يمكن الوصول إليه فقط داخل نفس الفئة التي تم الإعلان عنها

الآن ينشأ الارتباك عندما يتعلق الأمر default و protected

default --> لا توجد كلمة أساسية لتعديل الوصول.هذا يعني أنه متاح بشكل صارم ضمن حزمة الفصل. في أي مكان خارج تلك الحزمة يمكن الوصول إليها.

protected --> أقل صرامة قليلاً من default وبصرف النظر عن نفس فئات الحزمة، يمكن الوصول إليها عن طريق فئات فرعية خارج نطاق طَرد تم الإعلان عنه.

هذا كله يتعلق ب التغليف (أو كما ذكر جو فيليبس، المعرفة الأقل).

ابدأ بالأكثر تقييدًا (الخاص) ولاحظ ما إذا كنت بحاجة إلى معدّلات أقل تقييدًا لاحقًا.

نستخدم جميعًا معدّلات الطريقة والأعضاء مثل الخاص والعامة ...ولكن الشيء الوحيد الذي يفعله عدد قليل جدًا من المطورين هو استخدام الحزم من أجل تنظم رمز منطقيا.

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

Outside world -> Package (SecurityEntryClass ---> Package private classes)

شيء آخر هو أن الفئات التي تعتمد كثيرًا على بعضها البعض قد ينتهي بها الأمر في نفس الحزمة ويمكن في النهاية إعادة هيكلتها أو دمجها إذا كانت التبعية قوية جدًا.

إذا على العكس من ذلك قمت بتعيين كل شيء كما عام لن يكون واضحًا ما الذي يجب أو لا ينبغي الوصول إليه، مما قد يؤدي إلى كتابة الكثير من javadoc (الذي لا يفرض أي شيء عبر المترجم...).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top