الكلاسات والكائنات Class و Object
ما معنى البرمجة الكائنية؟ ما الفرق بين Class و Object؟ وكيف نبني برامج منظمة تعكس الواقع؟ بتشبيهات وأمثلة عملية مفصّلة.
ما هي البرمجة الكائنية (OOP)؟
حتى الآن تعلّمت كتابة أوامر مباشرة — طباعة، شروط، حلقات، دوال. الآن سننتقل إلى فكرة مهمّة تجعل البرمجة أكثر تنظيمًا: البرمجة الكائنية (Object Oriented Programming).
لا تقلق من الاسم — الفكرة أسهل مما تبدو. البرمجة الكائنية تعني أن البرنامج يُبنى من "أشياء" (Objects) تمثّل شيئًا من الواقع: شخص، سيارة، منتج، طالب، حساب بنكي...
شخص
سيارة
حساب بنكي
منتج
تشبيه — القالب والكعكة 🎂
قبل أن نكتب أي كود، دعنا نفهم الفكرة بتشبيه بسيط جداً:
القالب = Class
وصف ومواصفات — يحدد شكل الكعكة وعناصرها. لا يمكن أكله! مجرد وصف.
الكعكة = Object
نسخة حقيقية تم إنشاؤها من القالب — يمكن أكلها فعلاً!
من نفس القالب يمكن صنع كعكات لا نهاية لها — كذلك من نفس Class يمكن إنشاء Objects لا نهاية لها 🔁
مخطط البناء
= Class
المخطط يصف البيت — البيوت المبنية منه = Objects
قالب البسكويت
= Class
القالب واحد — البسكويت الناتج = Objects متعددة
تصميم السيارة
= Class
التصميم في المصنع واحد — آلاف السيارات = Objects
إنشاء Class — القالب في Java
سننشئ كلاساً اسمه Person (شخص). الكلاس يحتوي على خصائص (Fields) تصف هذا الشخص.
class Person { // خصائص الكلاس (Fields) String name; ← اسم الشخص int age; ← عمر الشخص }
⚠️ مهم جداً — الكلاس وحده لا يفعل شيئاً!
هذا الكلاس مجرد وصف: "الشخص عنده اسم وعمر". لا يطبع شيئاً ولا ينفّذ أي أمر. لكي يعمل يجب إنشاء Object منه.
📋 ماذا يمكن أن يحتوي الكلاس؟
Fields (الخصائص)
المتغيرات التي تصف الكائن — مثل name و age
Methods (الدوال)
الأفعال التي يمكن للكائن تنفيذها — مثل walk() و speak()
إنشاء Object — النسخة الحقيقية
الآن سننشئ كائناً (Object) من الكلاس Person. إنشاء الكائن يعني: حجز مساحة في الذاكرة لهذا الشخص ثم تعبئة بياناته.
// إنشاء Object من الكلاس Person Person p1 = new Person(); // تعبئة البيانات p1.name = "Ahmed"; p1.age = 25; // الوصول للبيانات وطباعتها System.out.println(p1.name); ← Ahmed System.out.println(p1.age); ← 25
🔍 شرح كل سطر بالتفصيل:
Person p1
تعريف متغير من نوع Person
مثل int x لكن هنا النوع هو Person بدل int. المتغير p1 سيحمل مرجعاً لكائن من نوع Person.
new Person()
إنشاء كائن جديد في الذاكرة
الكلمة المحجوزة new تخبر Java: "ابنِ لي نسخة جديدة من الكلاس Person في الذاكرة". بدون new لن يُنشأ أي كائن!
p1.name
الوصول لخاصية الكائن بالنقطة
النقطة . تعني "ادخل إلى هذا الكائن وصِلْ للخاصية". مثل قول: "p1 — خذ خاصية name الخاصة به".
الناتج:
Ahmed 25
إنشاء أكثر من Object من نفس Class
القوة الحقيقية لـ Class و Object تظهر هنا — يمكنك إنشاء أشخاص لا نهاية لهم من نفس الكلاس، كل واحد ببياناته المستقلة.
المشكلة بدون Class:
// متغيرات مبعثرة — صعبة الإدارة String name1 = "Ahmed"; int age1 = 25; String name2 = "Sara"; int age2 = 20; String name3 = "Ali"; int age3 = 30; // ماذا لو كان عندك 100 شخص؟!
الحل باستخدام Class و Object:
Person p1 = new Person(); p1.name = "Ahmed"; p1.age = 25; Person p2 = new Person(); p2.name = "Sara"; p2.age = 20; Person p3 = new Person(); p3.name = "Ali"; p3.age = 30; System.out.println(p1.name + " عمره " + p1.age); System.out.println(p2.name + " عمرها " + p2.age);
Ahmed عمره 25 Sara عمرها 20
🧠 لاحظ أن كل Object مستقل!
| الكائن | name | age |
|---|---|---|
| p1 | "Ahmed" | 25 |
| p2 | "Sara" | 20 |
| p3 | "Ali" | 30 |
تغيير p1.name لا يؤثر على p2.name — كل كائن لديه نسخته الخاصة من البيانات.
إضافة دوال (Methods) للكلاس
الكلاس لا يحتوي على خصائص فقط — يمكن إضافة دوال (Methods) تصف ما يمكن للكائن فعله. هذا يجعل الكائن أكثر حيوية!
class Person { // الخصائص String name; int age; // دالة — تطبع معلومات الشخص void printInfo() { System.out.println("الاسم: " + name + " | العمر: " + age); } // دالة — تُحيّي void greet() { System.out.println("مرحبًا، أنا " + name); } }
Person p1 = new Person(); p1.name = "Ahmed"; p1.age = 25; p1.printInfo(); ← استدعاء الدالة من الكائن p1.greet(); ← استدعاء دالة أخرى
الاسم: Ahmed | العمر: 25 مرحبًا، أنا Ahmed
داخل دوال الكلاس، يمكنك الوصول مباشرة للخصائص بأسمائها (name و age) بدون الحاجة لـ p1. لأن الدالة تعرف تلقائياً أنها تعمل على كائنها.
أخطاء شائعة عند المبتدئين ⚠️
نسيان كلمة new عند إنشاء الكائن
❌ خطأ
Person p1 = Person();
نسي new — لن ينشأ كائن
✅ صحيح
Person p1 = new Person();
الوصول للخصائص قبل إنشاء الكائن
❌ خطأ — NullPointerException
Person p1;
p1.name = "Ahmed";
p1 فارغ — لم يُنشأ بعد
✅ صحيح
Person p1 = new Person();
p1.name = "Ahmed";
الخلط بين اسم الكلاس واسم الكائن
Person
اسم الكلاس — القالب. يبدأ بحرف كبير.
p1
اسم الكائن (Object) — النسخة. يبدأ بحرف صغير.
📋 ملخص الدرس
Class = القالب / الوصف — يُعرَّف مرة واحدة
Object = النسخة الحقيقية — تُنشأ بـ new
النقطة . للوصول للخصائص والدوال
كل Object مستقل — تغيير بيانات p1 لا يؤثر على p2
⏭️ في الدرس القادم:
سنتعلم Constructor — طريقة أفضل لتهيئة الكائن وتعبئة بياناته مباشرة عند إنشائه بدل تعيينها سطراً سطراً.