المتغيرات الخاصة بالكائن مقابل المتغيرات الساكنة
جزء من قسم البرمجة كائنية التوجه في رحلة Java على Coddy. الدرس 15 من 87.
حتى الآن، ينتمي كل حقل أنشأناه إلى كائن محدد. لكل BankAccount قيمة balance خاصة به، ولكل Product قيمة name خاصة به. هذه هي متغيرات المثيل - فهي موجودة بشكل منفصل لكل مثيل من الفئة.
لكن ماذا لو كنت بحاجة إلى بيانات مشتركة بين جميع الكائنات؟ هنا يأتي دور المتغيرات الساكنة (وتُسمى أيضًا متغيرات الصنف). ينتمي المتغير الساكن إلى الصنف نفسه، وليس إلى أي كائن معيّن.
public class Student {
private String name; // متغير النسخة - فريد لكل طالب
private static int totalCount; // متغير ثابت - مشترك بين جميع الطلاب
public Student(String name) {
this.name = name;
totalCount++; // يزيد العداد المشترك
}
public static int getTotalCount() {
return totalCount;
}
}عندما تنشئ عدة طلاب، يكون لكل منهم name الخاص به، لكنهم جميعًا يتشاركون في totalCount نفسه:
Student s1 = new Student("Alice");
Student s2 = new Student("Bob");
System.out.println(Student.getTotalCount()); // الإخراج: 2لاحظ كيفية الوصول إلى المتغير الساكن من خلال اسم الفئة (Student.getTotalCount()) بدلًا من خلال كائن. يؤكد هذا على أن الأعضاء الساكنة تنتمي إلى الفئة، وليس إلى المثيلات.
استخدم متغيرات المثيل للبيانات التي تختلف بين الكائنات (مثل اسم الطالب). واستخدم المتغيرات الساكنة للبيانات التي ينبغي مشاركتها (مثل عدّ عدد الكائنات الموجودة).
التحدي
سهللننشئ نظام جرد للكتب باستخدام Book يتتبّع تفاصيل كل كتاب على حدة والعدد الإجمالي للكتب في مجموعتك بأكملها، وذلك باستخدام متغيرات الكائنات والمتغيرات الساكنة.
ستنشئ ملفين لتنظيم التعليمات البرمجية:
Book.java: أنشئ فئة Book تتتبّع معلومات كل كتاب على حدة، مع الاحتفاظ أيضًا بعدد جميع الكتب التي أُنشئت:- متغير كائن
title(String) - فريد لكل كتاب - متغير كائن
price(double) - فريد لكل كتاب - متغير ساكن
totalBooks(int) - مشترك بين جميع كائنات Book، ويتتبّع عدد الكتب التي أُنشئت - منشئ يستقبل العنوان والسعر، ويزيد العدد الإجمالي للكتب
- دالة getter باسم
getTitle()للعنوان - دالة getter باسم
getPrice()للسعر - دالة ساكنة باسم
getTotalBooks()تُرجع العدد الإجمالي للكتب التي أُنشئت
- متغير كائن
Main.java: أنشئ عدة كائنات من Book وأوضح كيفية تتبّع العداد الساكن لجميع الكائنات. ستتلقى ثلاثة عناوين للكتب وثلاثة أسعار كمدخلات. بعد إنشاء الكتب الثلاثة، اطبع أربعة أسطر:- عنوان كل كتاب وسعره بالتنسيق:
[title]: $[price](مع تنسيق السعر إلى منزلتين عشريتين) - العدد الإجمالي للكتب باستخدام الدالة الساكنة:
Total books: [count]
- عنوان كل كتاب وسعره بالتنسيق:
ستتلقى ستة مدخلات بالترتيب: title1، price1، title2، price2، title3، price3.
تذكّر الوصول إلى الدالة الساكنة من خلال اسم الفئة (Book.getTotalBooks()) بدلًا من الوصول إليها عبر كائن. ولتنسيق الأسعار، استخدم String.format("%.2f", price).
جرّب بنفسك
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// اقرأ المدخلات لثلاثة كتب
String title1 = scanner.nextLine();
double price1 = Double.parseDouble(scanner.nextLine());
String title2 = scanner.nextLine();
double price2 = Double.parseDouble(scanner.nextLine());
String title3 = scanner.nextLine();
double price3 = Double.parseDouble(scanner.nextLine());
// TODO: أنشئ ثلاثة كائنات Book باستخدام المدخلات أعلاه
// TODO: اطبع عنوان وسعر كل كتاب بالتنسيق: [title]: $[price]
// استخدم String.format("%.2f", price) لتنسيق السعر إلى منزلتين عشريتين
// TODO: اطبع العدد الإجمالي للكتب باستخدام الطريقة الثابتة
// Format: Total books: [count]
// تذكر الوصول إلى الطريقة الثابتة من خلال اسم الفئة: Book.getTotalBooks()
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات الـ OOP
الملفات الخارجيةمقدمة في الـ OOPالفئات (Classes) مقابل الكائنات (Objects)الكلمة المفتاحية thisالدوال (Methods)الحقول (Attributes)دالة البناء (Constructor)تعدد أشكال دالة البناء (Constructor Overloading)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسية (extends)الكلمة المفتاحية superإعادة تعريف الدوال (@Override)تسلسل المنشئات (Constructor Chaining)كلاس Objectالوراثة الأحادية ومتعددة المستوياتلماذا لا توجد وراثة متعددة للكلاساتمراجعة - هيكلية الموظفين7الدوال الخاصة وفئة Object
دالة toString()equals() و hashCode()دالة clone()compareTo() و Comparableواجهة Comparatorمراجعة - الترتيب المخصص2محددات الوصول والتغليف
نظرة عامة على مستويات الوصولدوال Getter و Setterإخفاء البياناتالكلمة المفتاحية finalمراجعة - مدير الحساب البنكي5تعدد الأشكال (Polymorphism)
أساسيات الـ Method Overloadingالـ Method Overriding (في وقت التشغيل)الـ Upcasting والـ Downcastingمعامل الـ instanceofالفئات والدوال المجردة (Abstract)مراجعة - حاسبة الأشكال8مفاهيم OOP المتقدمة
الـ Composition مقابل الـ Inheritanceالـ Aggregation مقابل الـ Compositionالفئات الداخلية والمتداخلة والمجهولة (Inner, Nested & Anonymous)الـ Enums ودوالهاالـ Records (Java 16+)الـ Sealed Classes (Java 17+)11أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factoryنمط Builderنمط Observerنمط Strategy3خصائص الفئة والعضو الساكن
المتغيرات الخاصة بالكائن مقابل المتغيرات الساكنةالدوال الساكنةالكتل البرمجية الساكنةالثوابت (static final)ملخص - العداد والأدوات المساعدة6الواجهات (Interfaces) والأصناف المجردة (Abstract Classes)
مقدمة في الواجهات (Interfaces)تنفيذ الواجهات (Interfaces)تنفيذ واجهات متعددةالـ Default و Static في الواجهاتالأصناف المجردة مقابل الواجهاتالواجهات الوظيفية (Functional Interfaces)مراجعة - نظام الدفع9الأنواع العامة (Generics)
مقدمة في الأنواع العامةالأصناف العامة (Generic Classes)الدوال العامة (Generic Methods)معاملات الأنواع المقيدةالرموز البديلة (?, extends, super)مراجعة - الحاويات العامة12أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكررتدرّب بنفسك: مترجم Java عبر الإنترنت