الفصول والكائنات
الفصول والكائنات
كل شيء في Java يدور حول فكرة محورية واحدة: الفصل (Class). الفصل هو مخطط — وصف دقيق لما يكون عليه الشيء وما يستطيع فعله. أما الكائن (Object) فهو نسخة حيّة واحدة من ذلك المخطط. متى فهمت هذا الفرق امتلكت مفتاح البرمجة كائنية التوجه (OOP) بأكملها.
تشبيه المخطط المعماري
فكّر في الفصل كمخطط معماري لمنزل. يصف المخطط كل غرفة وباب ونافذة، لكنه ليس منزلًا تعيش فيه — إنه مجرد وثيقة. حين يتّبع البنّاء المخطط ويشيّد منزلًا فعليًا، يصبح ذلك المنزل هو الكائن. يمكنك بناء منازل عديدة من المخطط ذاته؛ كل منزل مستقل ويمكن طلاؤه بلون مختلف، لكنها جميعًا تشترك في البنية نفسها.
في Java تسري المنطق ذاتها. تكتب الفصل مرة واحدة ثم تُنشئ منه نسخًا بقدر ما تشاء. لكل نسخة بياناتها الخاصة، غير أن جميعها تتصرف وفق القواعد المحددة في الفصل.
تعريف فصل
أبسط فصل ممكن في Java يبدو هكذا:
تحليل هذا الكود:
public— مُعدِّل وصول؛ يعني أن الفصول الأخرى تستطيع رؤية هذا الفصل.class Dog— الكلمة المفتاحيةclassمتبوعةً بالاسم. عرف Java: أسماء الفصول تبدأ بحرف كبير وتستخدم CamelCase.- الأقواس المعقوصة
{ }تحدد جسم الفصل — كل ما يملكه الفصل يوجد بداخلها. String nameوString breedوint ageهي حقول (تُسمّى أيضًا متغيرات النسخة). تخزّن حالة كل كائن على حدة.void bark()هي دالة — كتلة كود مُسمّاة يستطيع كائنات هذا الفصل تنفيذها.
public الاسم ذاته للملف الذي يوجد فيه. لذا يجب حفظ فصل Dog في ملف اسمه Dog.java. هذا قانون المُترجِم لا مجرد عرف.
إنشاء كائنات بالكلمة المفتاحية new
تعريف الفصل لا ينشئ أي بيانات وقت التشغيل — إنه يُخبر المُترجِم فحسب بما يبدو عليه الـ Dog. لإحضار كلب حقيقي إلى الوجود تستخدم الكلمة المفتاحية new:
ماذا يحدث حين تكتب new Dog()؟
- تُخصّص Java كتلة من الذاكرة في الكومة (heap) بحجم كافٍ لاستيعاب جميع حقول
Dog. - يُرجَع مرجع إلى تلك الكتلة ويُخزَّن في المتغير (
dog1أوdog2). - تبدأ الحقول بقيم افتراضية (
nullللكائنات،0للأعداد) حتى تُسنِد إليها قيمًا.
Dog dog1 = new Dog()، لا يحتوي المتغير dog1 على الكلب — إنه يحمل عنوانًا يشير إلى الكلب في الكومة. هذا مهم حين تمرّر كائنات إلى دوال أو تُسنِد متغيرًا إلى آخر.
الحقول تعود للنسخة
كل كائن يحتفظ بمجموعة حقول مستقلة خاصة به. تغيير dog1.name لا يؤثر البتة على dog2.name:
هذا هو جوهر حالة النسخة: كل كائن يعيش حياته الخاصة ببياناته الخاصة.
مثال أكثر ثراءً
إليك فصل BankAccount يُدخل دالة تنجز عملًا حقيقيًا:
account.balance = 1000.0 مباشرة. مع تقدم الدورة ستتعلم التغليف (Encapsulation) — إخفاء الحقول خلف private والتحكم في الوصول عبر دوال. في الوقت الحالي يتيح لك الوصول المباشر التركيز على مفهوم الفصل والكائن دون تعقيد إضافي.
لماذا يهم هذا؟
تتيح لك الفصول والكائنات نمذجة العالم الحقيقي مباشرةً في الكود. بدلًا من التعامل مع مصفوفات متوازية من الأسماء والسلالات والأعمار، يصبح لديك نوع Dog واحد يحتفظ ببياناته معًا ويعرف كيف يتصرف. مع نمو البرامج، هذا التجميع بين الحالة والسلوك في أنواع مُسمّاة هو ما يبقي الكود مقروءًا وقابلًا للصيانة.
الخلاصة
- الفصل مخطط يُعرّف حقولًا (الحالة) ودوالًا (السلوك).
- الكائن نسخة حيّة من الفصل، يُنشأ بـ
new ClassName(). - لكل كائن نسخته المستقلة من الحقول.
- المتغير الذي يحمل كائنًا يخزّن مرجعًا (عنوان الذاكرة) لا الكائن ذاته.
- أسماء الفصول تستخدم UpperCamelCase؛ الفصل المُعلَن
publicيجب أن يطابق اسم ملفه.