java - جافا - معنى كلمة عنوان بالانجليزي




ما الفرق بين الجمهور والحماية والحزمة الخاصة والخاصة في جافا؟ (16)

نشر

  • الطرق والمتغيرات والبنائين

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

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

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

ملحوظة

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

محمي

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

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

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

ملحوظة

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

عامة

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

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

  • الحزم المختلفة

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

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

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

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

  • داخل نفس الحزم

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

ملحوظة

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

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

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

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html http://www.tutorialspoint.com/java/java_access_modifiers.htm

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


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

نشر

كما تظن ، يمكن فقط للصنف الذي يتم الإعلان عنه رؤيته.

حزمة خاصة

لا يمكن رؤيتها واستخدامها إلا من خلال الحزمة التي تم الإعلان عنها. هذا هو الإعداد الافتراضي في Java (والذي يعتبره البعض خطأً).

محمي

يمكن مشاهدة الحزمة الخاصة + بواسطة الفئات الفرعية أو عضو الحزمة.

عامة

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

Published

مرئية خارج الكود الذي أسيطر عليه. (على الرغم من أنه ليس بناء جملة Java ، من المهم لهذه المناقشة).

يعرّف C ++ مستوى إضافي يسمى "friend" وأقل معرفة ذلك أفضل.

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

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

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

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

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

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


باختصار شديد

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

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

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

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

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

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

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

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

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

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


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

  • خاص : نطاق الصف.
  • افتراضي (أو حزمة خاصة ): نطاق الحزمة.
  • محمي : نطاق الحزمة + الطفل (مثل الحزمة ، ولكن يمكننا الفئة الفرعية من حزم مختلفة). يحتفظ المُعدّل المحمي دائمًا بعلاقة "parent-child".
  • الجمهور : في كل مكان.

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

  • (د) irect (استدعاء من طريقة داخل نفس الطبقة).
  • (R) eference (استدعاء أسلوب باستخدام مرجع إلى الفصل الدراسي أو عبر بناء الجملة "dot").
  • (I) nheritance (عبر subclassing).

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

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

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

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

+ : accessible
blank : not accessible

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


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

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

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


خاص : وصول محدود إلى الفصل فقط

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

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

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


معدّلات الوصول في 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();
  }
}

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


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

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

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

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

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


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

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


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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

هذا مرتبط بمعدلات Java Access .

من Java Access Modifiers :

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

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

من التحكم في الوصول إلى أعضاء البرامج التعليمية Class :

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

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

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

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

╔═════════════╦═══════╦═════════╦══════════╦═══════╗
║ 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 ، فإن مستويات الوصول تحدد أعضاء تلك الفئات التي يمكن أن تستخدمها فصولك الخاصة. ثانياً ، عندما تكتب فصل دراسي ، يجب أن تحدد مستوى الوصول لكل متغير عضو ويجب أن يكون لكل طريقة في صفك.


                | 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         |       ✔       |     ✘     |       ✘       |   ✘    




access-modifiers