فهرس المقرر
تدريب عملي

التدريب العملي 8: تجربة المحددات الأربعة بين حزمتين

مشروع Access Modifiers بحزمتين: package1 فيها ClassA و ClassB، و package2 فيها ClassC.

privatedefaultprotectedpublic

من الدرس 5. محددات الوصول Access Modifiers · كل التدريبات

١نص المسألة

في الحزمة package1 أنشئ ClassA بأربع خصائص، كل خاصية بمحدد وصول مختلف (public و private و protected و default)، ودالة showInfo تطبعها. ثم جرّب الوصول إلى الخصائص من ClassB في الحزمة نفسها، ومن ClassC في حزمة أخرى package2 مع الوراثة وبدونها.

٢الخوارزمية المقترحة

  1. أنشئ مشروع Access Modifiers والحزمة package1.
  2. ClassA: الخصائص f_public و f_private و f_protected و f_default، والدالة showInfo تطبعها جميعًا.
  3. ClassB (في package1): أنشئ كائنًا من ClassA واستدعِ showInfo ثم اطبع f_default. لاحظ أن f_private لا يظهر في قائمة الإكمال.
  4. أنشئ الحزمة package2 وفيها ClassC: كائن من ClassA لا يصل إلا إلى f_public.
  5. اجعل ClassC يرث ClassA، وأنشئ الكائن من ClassC، فيصل إلى f_protected أيضًا.

٣خطوات التطبيق

في NetBeans

  1. أنشئ مشروعًا باسم Access Modifiers دون Main Class.
  2. أنشئ الحزمة package1 وفيها ClassA بأربع خصائص بالمحددات الأربعة، ودالة showInfo.
  3. أنشئ ClassB في package1. اكتب obj. وانظر قائمة الإكمال: تظهر كل الخصائص ما عدا f_private.
  4. أنشئ الحزمة package2 وفيها ClassC. اكتب obj. : لا يظهر إلا f_public.
  5. اجعل ClassC يرث ClassA (extends ClassA) وأنشئ الكائن من ClassC: يظهر f_protected أيضًا.
  6. نفّذ كل كلاس بـ Run File (Shift+F6).

في OneCompiler

  1. افتح OneCompiler من زر «▶ شغّل المشروع» أسفل الحل، أو من موقع onecompiler.com/java.
  2. في OneCompiler تُكتب كل الكلاسات في ملف واحد Main.java؛ زر التشغيل يجمعها لك تلقائيًّا.
  3. إذا كان البرنامج يقرأ من لوحة المفاتيح، فاكتب المدخلات في خانة STDIN التي تظهر تحت الكود في محرّر OneCompiler، ثم اضغط Run.

٤المخرجات المطلوبة

نفّذ برنامجك، ويجب أن تظهر المخرجات التالية:

Output – (run)×
run:
public
private
protected
default
default
BUILD SUCCESSFUL (total time: 0 seconds)

٥الحل المقترح

حاول بنفسك أولًا، ثم قارن حلّك بالحل المقترح (كود التدريب من مذكرة العملي):

👁 اعرض الحل المقترح
«uses»«package1»ClassA+ f_public : String- f_private : String# f_protected : String~ f_default : String+ showInfo() : void«package1»ClassB+ main(args) : void«package2»ClassC+ main(args) : void
🧩 ClassB في الحزمة نفسها فيصل إلى كل شيء ما عدا private. وClassC في حزمة أخرى ويرث ClassA، فيصل إلى public و protected فقط.
+ public- private# protected~ defaultمسطّر: staticمائل: abstract
package package1; public class ClassA {    public String f_public = "public";    private String f_private = "private";    protected String f_protected = "protected";    String f_default = "default";     public void showInfo(){        System.out.println(f_public);        System.out.println(f_private);        System.out.println(f_protected);        System.out.println(f_default);    }}
package package1; public class ClassB {    public static void main(String[] args) {        ClassA obj = new ClassA();        obj.showInfo();        System.out.println(obj.f_default);    }}
مخطط المشروع مستخرج من الكود. انقر على أي كلاس لفتح كوده.
ClassAClassB
ClassA+ f_public : String- f_private : String# f_protected : String~ f_default : String+ showInfo() : voidClassB+ main(args : String[]) : void

ملفات المشروع في تبويبات كما في NetBeans. زر التشغيل يجمعها في ملف واحد ليعمل على OneCompiler.

Output – Access Modifiers (run)×
run:
public
private
protected
default
default
BUILD SUCCESSFUL (total time: 0 seconds)

الجزء الثاني: ClassC في package2

package package2; import package1.ClassA; public class ClassC extends ClassA{     public static void main(String[] args) {        ClassC obj = new ClassC();         System.out.println(obj.f_protected);    }}
مخطط المشروع مستخرج من الكود. انقر على أي كلاس لفتح كوده.
ClassC
ClassC+ main(args : String[]) : void
Output – Access Modifiers (run)×
run:
protected
BUILD SUCCESSFUL (total time: 0 seconds)

ClassC يحتاج ClassA من الحزمة الأخرى، فشغّله في NetBeans.

أسئلة المناقشة

أسئلة مناقشة على التدريب 8. إجاباتك تُحفظ تلقائيًّا على هذا الجهاز؛ أجب ثم اضغط «صحّح ورقتي».

1السؤال الأول: اختر الإجابة الصحيحة

1) أي من محددات الوصول يمكن الوصول إليه من أي كلاس في أي حزمة؟
2) أي من محددات الوصول لا يمكن الوصول إليه إلا من داخل نفس الكلاس فقط؟
3) في الكود، لماذا تستطيع الدالة
snippet
 showInfo()في ClassA
الوصول إلى جميع الحقول (حتى private)؟
4) الحقل f_default (بدون أي modifier) يمكن الوصول إليه من:
5) لماذا يستطيع ClassC (الموجود في package2) الوصول إلى f_protected؟
6) ماذا يحدث إذا حاولنا الوصول إلى f_private من كلاس ClassB؟
أجب عن الأسئلة ثم اضغط «صحّح ورقتي».