تمرير وإرجاع المرجعيات
مُقدَّم| English | المعنى |
|---|---|
| NullPointerException/nʌl ˈpɔɪntə ekˈsepʃn/ | NullPointerException |
تعديل الكائن يختلف عن إعادة تعيين المعامل
- المُدْعِي يشير إلى طالب بدرجة 10. تنفذ الطريقة s.addScore(5)؛ ثم s = new Student("Other");
- تصبح درجة الكائن المشترك الأصلي 15. إعادة تعيين المعامل المحلي لا تُغيّر متغير المُدْعِي، لأن جافا تنسخ قيمة المرجع إلى المعامل.
تمرير كائن إلى طريقة
- جافا تنسخ قيمة المرجع إلى معاملة الطريقة؛ ولا تنسخ الكائن. معاملة الطريقة تشير إلى نفس الكائن الذي يشير إليه متغير المُدْعِي.
- لذلك فإن التغييرات التي تقوم بها الطريقة على الكائن مرئية للمُدْعِي. يتم تمرير كل من المعاملات الأولية ومرجعيات القيم بالقيمة؛ ولا يزال المرجع المنسوخ قادراً على الوصول إلى كائن مشترك.
القيم الأولية مقابل الكائنات كمعاملات
- المعامل الأولي منسوخ — لا تستطيع الطريقة تغيير متغير المُدْعِي. بالنسبة لمعامل الكائن، يصل المرجع المنسوخ إلى نفس الكائن — مما يسمح للطريقة بتعديله.
- لا يمكن لـ
changeInt(x)تغييرx؛ بل يغيرstudent.addScore(10)ذلك الطالب. اسأل عن ما إذا كان الدالة يُعدّل الكائن المشترك أو يعيد تعيين المعامل المحلي فقط.
إرجاع كائن
- يمكن للدالة أن تُرجع مرجعاً إلى كائن — مما يجعل المُدعي يشاركه. يُعيد
public Student topStudent() { return best; }مرجعاً إلىbest. - إرجاع
bestيشارك كائناً موجوداً. وعلى النقيض، يبنيreturn new Student("Copy");كائناً جديداً ويرجع مرجعه؛ كما يمكن للدالة إرجاعnull. اقرأ تعبير الإرجاع قبل تحديد ما إذا كانت الحالة مشتركة.
مشارية منسوخة، كائن مشترك؛ نوع بدائي منسوخ
تتغير درجة الكائن؛ القيمة البدائية x لا تتغير.
عند تمرير كائن لدالة، تستقبل الدالة...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
ينسخ Java قيمة المشارية إلى متغير معلمات منفصل. يمكن لكلا المشاريتين الوصول إلى نفس الكائن؛ ولا يستبدل إعادة تعيين المعامل متغير المُنطِق.
يمكن للدالة تغيير متغير int للمُستدعي بتعديل وسيطها.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
القيم البدائية تُنسخ — متغير int للمُستدعي يبقى دون تغيير.
استدعاء منهج عرضي عبر مشارية null يثير...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
null يشير إلى عدم وجود كائن، لذا لا يوجد شيء يمكن استدعاء الدالة عليه.
يمكن للدالة إرجاع مرجع إلى كائن، والذي يشاركه المُبدئ لاحقاً.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
يمكن للمنهج إرجاع المشارية الموجودة للكائن ومشاركته مع المُنطِق. ويمكن لمنهج آخر بناء وإرجاع كائن جديد بدلاً من ذلك.
لاستخدام مرجح قد يكون null بأمان، يجب عليك أولاً التحقق من...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
احذر من null قبل استدعاء دالة على المرجح.
يجب على كل منهج يُرجع المشارية Student إرجاع كائن موجود مسبقًا.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
خطأ: return new Student("Other"); يقوم بإنشاء وإرجاع كائن جديد.
المرجع الفارغ (null)
- المرجع الذي يشير إلى لا كائن هو
null. استدعاء دالة حالة عبرnullيُسبب استثناء NullPointerException. - إرجاع
null(مثلاً "لم يتم العثور") شائع — يجب على المُدعي التحقق منه. استخدم guard معif (s != null) { s.addScore(10); }قبل استخدام مرجع قد يكون فارغاً.
تمرير كائن ينسخ قيمة المرجع — مما يسمح للدالة بتغيير كائن المُدعي؛ أما تمرير نوع أولي فينسخ القيمة — فلا. لذا student.addScore(10) يُعدّل كائن المُدعي، لكن changeInt(x) يترك x الخاص بالمُدعي دون تغيير. واستدعاء دالة حالة عبر مرجع null يُسبب استثناء NullPointerException — تحقق من != null أولاً عندما قد يكون المرجع فارغاً.
After the two statements, what is the original caller-referenced Student score?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
The first statement mutates the original object to 15. The later local reassignment does not replace the caller reference.
يعود المنهج new Student("Other"); لكن المُنطِق يتجاهل النتيجة. ماذا يحدث لمتغير Student الحالي لدى المُنطِق؟
Difficulty 1/5 · 100 coins + a small bonus on first completion today
إرجاع المشارية لا يعني تعيينها داخل متغير المُنطِق. لا يزال المتغير الموجود يشير إلى كائنه الأصلي.
المرجع مقابل القيمة:
void addTen(Student s) { s.addScore(10); }— تُغيّر الكائن المُمرَر (مرجع مشترك).void addTen(int x) { x += 10; }— يتبقىintالخاص بالمُنادي كما هو (قيمة مُnusakhed).- يتم نسخ قيمتا المعاملين؛ ويصل فقط المرجع المنسوخ إلى الحالة القابلة للتعديل المشتركة.
انقل الاستدلال إلى حالة جديدة
- قارن بين
return s;وreturn new Student("Other");: الأول يُرجع المرجع المقدم؛ والثاني يُرجع كائناً تم بناؤه حديثاً. لا يغير أي منهما متغير المُدعي حتى يقوم المُدعي بإسناد النتيجة. - للتنبؤ بالتغيير، ارسم المُدعي والمعامل كمتغيرات مرجع منفصلة تشير إلى كائنات. حدّث الكائن لاستدعاء مُعدِّل، وحدّث فقط سهم المعامل لإعادة تعيين المعامل.
تمرير مرجع كائن ينسخ قيمته داخل المعامل، لذا فإن الدالة يمكنها تغيير كائن المُدعي؛ بينما تمرير نوع أولي ينسخ القيمة، لذا فهي لا تستطيع. يمكن للدالة أن تُرجع مرجعاً إلى كائن. المرجع الذي لا يشير إلى كائن هو null — استدعاء دالة حالة عبره يُسبب استثناء NullPointerException، لذا تحقق أولاً.