الكلاسات والكائنات Class و Object

18:00 دقائق مجاني

ما معنى البرمجة الكائنية؟ ما الفرق بين Class و Object؟ وكيف نبني برامج منظمة تعكس الواقع؟ بتشبيهات وأمثلة عملية مفصّلة.

ما هي البرمجة الكائنية (OOP)؟

حتى الآن تعلّمت كتابة أوامر مباشرة — طباعة، شروط، حلقات، دوال. الآن سننتقل إلى فكرة مهمّة تجعل البرمجة أكثر تنظيمًا: البرمجة الكائنية (Object Oriented Programming).

لا تقلق من الاسم — الفكرة أسهل مما تبدو. البرمجة الكائنية تعني أن البرنامج يُبنى من "أشياء" (Objects) تمثّل شيئًا من الواقع: شخص، سيارة، منتج، طالب، حساب بنكي...

👤

شخص

🚗

سيارة

🏦

حساب بنكي

📦

منتج

💬 بدل أن تفكر في البرنامج كسلسلة من الأوامر، تفكر فيه كمجموعة من الأشياء التي تتفاعل مع بعضها — تمامًا كما يعمل العالم الحقيقي.

تشبيه — القالب والكعكة 🎂

قبل أن نكتب أي كود، دعنا نفهم الفكرة بتشبيه بسيط جداً:

🍰

القالب = Class

وصف ومواصفات — يحدد شكل الكعكة وعناصرها. لا يمكن أكله! مجرد وصف.

🎂

الكعكة = Object

نسخة حقيقية تم إنشاؤها من القالب — يمكن أكلها فعلاً!

من نفس القالب يمكن صنع كعكات لا نهاية لها — كذلك من نفس Class يمكن إنشاء Objects لا نهاية لها 🔁

🏠

مخطط البناء

= Class

المخطط يصف البيت — البيوت المبنية منه = Objects

🍪

قالب البسكويت

= Class

القالب واحد — البسكويت الناتج = Objects متعددة

🚗

تصميم السيارة

= Class

التصميم في المصنع واحد — آلاف السيارات = Objects

إنشاء Class — القالب في Java

سننشئ كلاساً اسمه Person (شخص). الكلاس يحتوي على خصائص (Fields) تصف هذا الشخص.

Person.java
class Person {
    // خصائص الكلاس (Fields)
    String name;   ← اسم الشخص
    int    age;    ← عمر الشخص
}

⚠️ مهم جداً — الكلاس وحده لا يفعل شيئاً!

هذا الكلاس مجرد وصف: "الشخص عنده اسم وعمر". لا يطبع شيئاً ولا ينفّذ أي أمر. لكي يعمل يجب إنشاء Object منه.

📋 ماذا يمكن أن يحتوي الكلاس؟

📦

Fields (الخصائص)

المتغيرات التي تصف الكائن — مثل name و age

⚙️

Methods (الدوال)

الأفعال التي يمكن للكائن تنفيذها — مثل walk() و speak()

إنشاء Object — النسخة الحقيقية

الآن سننشئ كائناً (Object) من الكلاس Person. إنشاء الكائن يعني: حجز مساحة في الذاكرة لهذا الشخص ثم تعبئة بياناته.

Main.java
// إنشاء 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) تصف ما يمكن للكائن فعله. هذا يجعل الكائن أكثر حيوية!

Person.java (مع دوال)
class Person {
    // الخصائص
    String name;
    int    age;

    // دالة — تطبع معلومات الشخص
    void printInfo() {
        System.out.println("الاسم: " + name + " | العمر: " + age);
    }

    // دالة — تُحيّي
    void greet() {
        System.out.println("مرحبًا، أنا " + name);
    }
}
Main.java
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 — طريقة أفضل لتهيئة الكائن وتعبئة بياناته مباشرة عند إنشائه بدل تعيينها سطراً سطراً.