الوصول المحمي لجافا لا يعمل
-
22-07-2019 - |
سؤال
في جافا، هناك ثلاثة مستويات من الوصول:
- عام - منفتح على العالم
- خاص - مفتوح للفصل فقط
- محمي - مفتوح فقط للفئة وفئاتها الفرعية (الميراث).
فلماذا يسمح مترجم جافا بحدوث ذلك؟
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
لأي فئة.