النطاق والوصول
مُقدَّم| English | المعنى |
|---|---|
| local variable/ˈləʊkl ˈveərɪəbl/ | متغير محلي |
| scope/skəʊp/ | نطاق |
| shadows/ˈʃædəʊz/ | إخفاء |
يعيد المتغيرات المحلية؛ يتذكر الحقل
- تنشئ الدالة
int count = 0;، وتزيده، وتعيد 1. عند استدعاء تلك الدالة مرتين، يتم إرجاع 1 في كل مرة لأن كل استدعاء يمتلك متغيراً محلياً جديداً. - الدالة التي تزيده حقل كائن بدلاً من ذلك تعيد 1 ثم 2 لنفس الكائن الذي كانت قيمته الأولية صفراً. اميز بين مكان استخدام الاسم ومتى يتم الاحتفاظ بالحالة المخزنة.
النطاق يتعلق باسم في الكود المصدر
- نطاق الإعلان هو الجزء من البرنامج حيث يمكن استخدام اسمه. يكون المحل المحلي في نطاق من إعلانهم حتى نهاية المحل المتبقي؛ متغير حلقة for غير متاح بعد تلك الحلقة.
- النطاق، وإذن الوصول، والعمر الإجابة أسئلة مختلفة. قد يكون الاسم خارج النطاق على الرغم من أن كائناً كان يشار إليه سابقاً لا يزال قابلاً للوصول من خلال مرجح آخر؛ الحقول لا تحكمها نفس قاعدة إعلان المحلات المحلية.
قم بتهيئة المتغيرات المحلية قبل قراءتها
- المتغير المحلي يتم الإعلان عنه في دالة أو محل. يتطلب جافا أنه يتم تعيينه بشكل مؤكد قبل قراءة قيمته؛
int x; return x;هو خطأ في وقت الترجمة، وليس إرجاعاً تلقائياً للصفر. - حقول الكائن تستقبل قيمًا افتراضية أثناء الإنشاء قبل تشغيل المبدئات وكود المنشئ. في المثال، يبدأ count عند 0؛ ينتمي هذا الحقل لكل كائن ويستمر بين استدعاءاته.
public class ScopeCounter {
private int count;
public int localCount() {
int count = 0;
count++;
return count;
}
public int rememberedCount() {
count++;
return count;
}
public void setCount(int count) {
this.count = count;
}
public static int readCount(ScopeCounter other) {
return other.count;
}
}
إعلان المتغير المحلي int x; يمنح x القيمة صفر تلقائياً، لذا يمكن تجميع return x; بنجاح.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
يجب تعيين المتغيرات المحلية بشكل مؤكد قبل قراءتها؛ لا تنطبق قيم الافتراض الخاصة بالحقول على المتغيرات المحلية.
A parameter can hide a field name
- المعامل
countفيsetCount(int count)يُظلل الحقل للاستخدامات غير المؤهلة لذلك الاسم.count = count;سيقوم بتعيين المعامل إلى نفسه؛this.count = count;يُحدِّث حقل المستقبل. - يمكن للمتغيرات المحلية أيضًا أن تُظل الحقول، كما يوضح localCount. لا تفترض أن كل إعلان محلي مكرر مسموح به: إعادة الإعلان عن متغير محلي موجود بالفعل في النطاق داخل كتلة متداخلة لنفس الدالة هو خطأ وقت الترجمة.
نطاق المتغير هو...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
النطاق هو المكان الذي يكون فيه الاسم صالحاً.
بعد انتهاء استدعاء طريقة عادية، هل يمكن للمكالم استخدام متغير محلي تم الإعلان عنه فقط داخل تلك الطريقة باسمه المحلي؟
Difficulty 1/5 · 100 coins + a small bonus on first completion today
الاسم المحلي ليس في نطاق المكالم. يمكن لكائن يُشار إليه بواسطة ذلك الاسم المحلي nevertheless أن يُعاد وتبقى reachable.
أي نوع من المتغيرات يجب أن يحمل الحالة التي يجب أن يتذكرها الكائن بين استدعاءات الـ methods؟
Difficulty 1/5 · 100 coins + a small bonus on first completion today
متغيرات Instance تستمر طوال عمر الكائن.
المعامل الذي يحمل نفس اسم متغير Instance يحجب (يخفي) ذلك المتغير داخل الـ method.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
داخل الـ method، يعني الاسم المعامل؛ استخدم this للوصول إلى الحقل.
عندما يحجب معامل متغير Instance بنفس الاسم، يُقال إنه ___ له (كلمة واحدة).
Difficulty 1/5 · 100 coins + a small bonus on first completion today
الحجب يخفي الحقل خلف الاسم المحلي.
Access depends on the declaring class
- يمكن لكود داخل ScopeCounter قراءة count الخاص بكائن ScopeCounter آخر عبر مرجع صريح. طريقة القراءة الثابتة الموضحة لا تحتوي على
this، لكنother.countصالح لمعامل غير null. - لا يمكن لفئة خارجية غير ذات صلة قراءة ذلك الحقل الخاص بشكل مباشر. الوصول الخاص ليس مقيدًا بـ "كائني فقط"؛ تمتلك دالة الكائن مستقبلًا ضمنيًا، بينما تحتاج الدالة الثابتة إلى مرجع صريح للوصول إلى حالة الكائن.
لا تجمع بين نطاق الاسم والتهيئة الافتراضية والوصول الخاص في قاعدة واحدة. المتغير المحلي لا يبدأ تلقائيًا بالصفر، ولا يمكن قراءة حقل الكائن دون مؤهل من دالة ثابتة، ويمكن الوصول إلى حقل خاص لكائن آخر داخل فئته المُعلِنة.
النطاق، حالة الحقل، وإذن الوصول
فرق بين Declarations وسياق الوصول؛ ليست العينة الأخرى محجوبة بشكل تلقائي.
قد تقرأ دالة readCount الثابتة المعروضة قيمة other.count عندما تكون other غير فارغة (non-null).
Difficulty 1/5 · 100 coins + a small bonus on first completion today
يستخدم مرجع كائن صريح ويوجد داخل الفئة التي تعلن عن الحقل الخاص؛ لا حاجة لـ this الضمني.
Predict a new receiver and a returned object
- بعد استدعاءين rememberedCount على a، يكون حقله 2؛ لا يزال b المنشأ حديثًا يمتلك count 0. إرجاع a.localCount() هو 1 بدون تصفير حقل a، لأن عددها المحلي يُظل ذلك الحقل.
- يمكن للدالة إنشاء كائن في متغير محلي وإرجاع مرجعه. يصبح اسم المتغير غير متاح للمدعي، لكن الكائن المُرجَع يمكن أن يبقى قابلًا للوصول؛ نهاية نطاق الاسم لا تُدمر ذلك الكائن.
النطاق يخبر أين يمكن استخدام الاسم؛ تحدد التعديلات permission؛ يمكن لحالة الكائن أن تدوم أطول من مرجع محلي. قم بتهيئة المتغيرات المحلية قبل قراءتها، استخدم الحقول للحالة المرسومة لكل كائن، وميز بين الظل والوصول إلى حقل خاص لكائن آخر.
بالنسبة لـ ScopeCounter a المبنى حديثاً، استدعِ a.rememberedCount() مرتين، ثم a.localCount(). ماذا يُرجع a.localCount()؟
Difficulty 2/5 · 140 coins + a small bonus on first completion today
يتمتع localCount بعدداً محلياً جديداً مُهيأ بصفر؛ إنه يزيد هذا العداد ويرجع 1 دون تغيير الحقل.