سؤال

في جافا، هناك ثلاثة مستويات من الوصول:

  • عام - منفتح على العالم
  • خاص - مفتوح للفصل فقط
  • محمي - مفتوح فقط للفئة وفئاتها الفرعية (الميراث).

فلماذا يسمح مترجم جافا بحدوث ذلك؟

TestBlah.جافا:

public class TestBlah {

    public static void main(String[] args) {
        Blah a = new Blah("Blah");
        Bloo b = new Bloo("Bloo");
        System.out.println(a.getMessage());
        System.out.println(b.getMessage()); //Works
        System.out.println(a.testing);
        System.out.println(b.testing); //Works
    }
}

بلاه جافا:

public class Blah {
    protected String message;

    public Blah(String msg) {
        this.message = msg;
    }

    protected String getMessage(){
        return(this.message);
    }   
}

بلو جافا:

public class Bloo extends Blah {
    public Bloo(String testing) {
        super(testing);
    }
}
هل كانت مفيدة؟

المحلول

في الواقع ينبغي أن يكون:

مفتوح فقط ل الطبقات على نفس الحزمة الفئة وفئاتها الفرعية (الميراث)

لهذا

نصائح أخرى

لأن المحمية تعني فئة فرعية أو فئات أخرى في نفس الحزمة.

ويوجد في الواقع مستوى وصول "افتراضي" رابع، عند حذف المُعدِّل، والذي يوفر الوصول إلى فئات أخرى في نفس الحزمة.

لذا protected بين الافتراضي و public وصول.

لنكون أكثر تحديدا، أنت تتوقع protected للعمل كما هو الحال في C++.

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

انظر هذا السؤال المماثل لمزيد من المعلومات المحددة حول علامات الميراث.

أنا شخصياً لا أستخدمه أبدًا تقريبًا protected.أقوم بتطوير التطبيقات بدلاً من الأطر، لذلك من المرجح أن أقوم بالتعريف public طُرق، private البيانات، وفي كثير من الأحيان، وضع علامة على صفي بأكمله كـ final.

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

أنت قادر على الاتصال b.getMessage() لأن b هو من النوع Bloo, ، الذي يمتد Blah, ، و getMessage() محمي.محمي، كما ذكرت، يسمح للفئات الفرعية بالوصول إلى الطريقة.

ومع ذلك، فقد حصلت على الأخطاء التالية:

  • الاتصال super() مع عدم وجود حجج في Bloo منشئ خطأ.لا يمكن للمترجم العثور على المعلمة Blah مُنشئ لأنك حددت واحدًا باستخدام معلمة سلسلة.
  • الاتصال new Blah() في TestBlah main الطريقة خاطئة لنفس السبب المذكور أعلاه.
  • بالاشارة الى a.testing و b.testing خطأ لأنك لم تحدد المتغير testing لأي فئة.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top