متغيرات ووظائف الفئة
مُقدَّم| English | المعنى |
|---|---|
| static variable/ˈstætɪk ˈveərɪəbl/ | متغير ثابت |
| static method/ˈstætɪk ˈmeθəd/ | دالة ثابتة |
كائنان، عدد بناء واحد
- لدى آدا وبو درجات منفصلة، لكن إنشاء كل طالب يزيد نفس المتغير الثابت،
Student.count. بعد عمليتي بناء، يكون العدد 2؛ وتغيير درجة آدا لا يغير درجة بو. - قارن بما تصفه كل قيمة: الدرجة تصف طالباً واحداً، بينما هذا العداد يصف عمليات بناء الفئة. ولا ينشئ مرجع منسوخ لآدا كائناً جديداً ولا يزيد العداد.
ضع كل حقل في المستوى الصحيح
- الحقل الحالة له موقع تخزين منفصل في كل كائن. والحقل الثابت له موقع تخزين واحد لهذه الفئة المحملة، حتى قبل بناء أي كائنات؛ حيث يتحكم
privateفي الوصول، وليس في عدد النسخ. - في هذا المثال الصغير أحادي الخيط، يزيد المُنشئ
countمرة واحدة عند كل إنشاء. إنه يعدّ الكائنات المنشأة، وليس الكائنات التي لا تزال حية: فقدان مرجع لا يقلل منه تلقائيًا.
class Student {
private int score;
private static int count = 0;
public Student(int initialScore) {
score = initialScore;
count++;
}
public int getScore() { return score; }
public void setScore(int newScore) { score = newScore; }
public static int getCount() { return count; }
public static int readScore(Student s) { return s.score; }
}
عدّاد static واحد مشترك
count هي قيمة مشتركة واحدة، ملك للفئة.
المتغير Static (الفئة) هو...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
static تعني نسخة مشتركة واحدة ملكها الفئة.
إذا كان الـ constructor يقوم بـ count++ وبدأ count من 0، فما قيمة count بعد إنشاء 3 كائنات؟
Difficulty 2/5 · 140 coins + a small bonus on first completion today
كل بناء يزيد العدّاد المشترك → 3.
الدالة الثابتة ليس لها مستقبل
- الدالة الثابتة ليس بها كائن حالي ضمني، لذا لا يمكنها استخدام
thisأو حقل حالة غير مؤهل مثلscore. يمكن لـgetCount()قراءةcountلأن ذلك الحقل يخص الفئة. - الثابت لا يمنع العمل مع الكائنات. يستقبل
readScore(Student s)مرجع كائن صريح ويقرأs.score؛ وهي داخلStudent، حيث يُسمح بالوصول إلى ذلك الحcrawl الخاص. وهنا يجب أن يكونsغير فارغ.
return score; داخل دالة ثابتة هو خطأ في وقت الترجمة في هذه الفئة. return s.score; داخل الدالة الثابتة الموضحة صحيح: المرجح يحدد أي طالب يجب قراءة نتيجته.
داخل فئة Student الموضحة، يمكن للدالة الثابتة استخدام return score؛ دون تحديد أي كائن Student.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
خطأ: score هو حقل عينة، وهذه الدالة الثابتة ليس لها مستقبل ضمني. مع معيار Student s غير فارغ، فإن return s.score؛ صالحة داخل Student.
داخل Student، أي دالة ثابتة يمكنها قراءة score لمعيار s غير فارغ؟
Difficulty 1/5 · 100 coins + a small bonus on first completion today
المرجع الضمني s يحدد الكائن؛ يمكن لـ Student نفسها الوصول إلى حقل score الخاص بها.
تتبع استدعاءات الفئات والكائنات
- بعد
Student a = new Student(50);وStudent b = new Student(75);، يكونStudent.getCount()هو 2، وa.getScore()هو 50، وb.getScore()هو 75.a.setScore(60)يغير نتيجة آدا فقط. Student.readScore(a)ثم يعيد 60 دون إنشاء طالب آخر. الدالة ثابتة، ومع ذلك فإن معاملها الصريح يحدد كائناً موجوداً يقرأ حالته.
تُستدعى دالة Instance مثل getScore() على...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
أعضاء Instance تعمل على كائن محدد.
فصل القواعد النحوية القانونية عن الأسلوب الواضح
- يُفضّل
Student.getCount()لإظهار أن الدالة تابعة للفئة. يسمح جافا أيضاً بـa.getCount()لهذه الدالة الثابتة؛ لا يجعل هذا النحو العد مخصصاً لآدا. a.getScore()هو استدعاء حالة مع آدا كمتلقٍ لها.Student.getScore()غير صالح هنا لأن الدالة تحتاج إلى كائن وليست ثابتة؛ اختر أنواع الحقول والدوال من مسؤولياتها.
أي استدعاء يظهر بشكل أفضل أن getCount() هو منهج ساكن (static method) في Student؟
Difficulty 1/5 · 100 coins + a small bonus on first completion today
يُعرّف Student.getCount() بوضوح اسم الفئة. يُسمح لـ Java أيضًا باستخدام student.getCount() للدالة الثابتة، لكن هذا الصياغة يُضلل معناها على مستوى الفئة.
تنبأ بنسخة مرجح
- بدءاً من طلبة تم إنشاؤهما، يترك
Student alias = a;عدد الإنشاءات عند 2.alias.setScore(90)يغير كائن آدا الموجود، لذاa.getScore()هو 90 وتبقى نتيجة بو 75. - عد تنفيذات
new Student(...)، ثم تابع حالة كل كائن على حدة. لا ينشئ أي استدعاء لجلب أو تعيين مرجح طالباً، وقد تقرأ الدالة الثابتة كائناً تم تزويده به صراحةً.
حقول ثابتة تخزن حالة الفئة؛ حقول الحالة تخزن حالة الكائن. لا تمتلك الدوال الثابتة this، لكنها قد تستخدم مراجع كائنات صريحة. يُفضّل استدعاءات الدوال الثابتة المؤهلة بالفئة وتميز بين عدود الإنشاء وعدود الكائنات الحية.
تم إنشاء طالبين، لذا يكون count 2. ثم Student alias = a؛ وalias.setScore(90); يعمل. ما هي Student.getCount()؟
Difficulty 2/5 · 140 coins + a small bonus on first completion today
لا تنفيذ بناء الدالة عند تعيين مرجع أو تغيير درجة. يبقى count 2.
ينخفض عداد البناء هذا تلقائيًا عندما يتم فقدان مرجع لطالب.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
فقط الكود الذي يغير count يغيره. يعدل هذا المثال البناءات ولا يوفر أي إنقاص.