تطبيق OOP عمليًا | Person مع Methods بشرح تفصيلي للمبتدئين
تطبيق يربط OOP بالممارسة: كلاس Person بخصائص خاصة وسلوكيات (Methods) لفهم فكرة "بيانات + سلوك في مكان واحد".
جوهر OOP — بيانات + سلوك
في البرمجة الكائنية لا نضع بيانات فقط داخل الكلاس — بل نضع أيضاً سلوكاً.
مثلاً: الشخص لديه اسم وعمر (بيانات)، لكنه أيضاً يستطيع أن يُعرّف بنفسه ويزيد عمره في عيد ميلاده (سلوك). هذا هو جوهر OOP.
📦 البيانات (Fields)
- •
name— اسم الشخص - •
age— عمر الشخص
⚙️ السلوك (Methods)
- •
introduce()— يعرّف بنفسه - •
birthday()— يزيد عمره سنة
كلاس Person — بيانات وسلوك
سنبني كلاساً متكاملاً يجمع private fields + Constructor + Methods:
class Person { // ① البيانات — private لحماية الخصائص private String name; private int age; // ② Constructor — تهيئة عند الإنشاء Person(String name, int age) { this.name = name; this.age = age; } // ③ السلوك — دالة التعريف public void introduce() { System.out.println("اسمي " + name + " وعمري " + age); } // ④ السلوك — عيد الميلاد يزيد العمر public void birthday() { age++; System.out.println("🎂 عيد ميلاد سعيد " + name + "! عمرك الآن " + age); } // ⑤ السلوك — هل هو بالغ؟ public boolean isAdult() { return age >= 18; } }
حماية البيانات
name و age لا يمكن تعديلها من خارج الكلاس — تطبيق Encapsulation.
تهيئة بسطر واحد
بدل تعبئة name وage يدوياً، Constructor يتولى ذلك عند الإنشاء.
سلوك التعريف
دالة تُعرّف الشخص بنفسه — تصل لـ name وage مباشرةً لأنها داخل نفس الكلاس.
سلوك عيد الميلاد
تزيد العمر بمقدار 1 — لاحظ أنها تعدّل البيانات الداخلية مباشرةً بأمان.
استخدام الكلاس داخل main
الآن ننشئ كائنات ونستدعي سلوكياتها:
public class Main { public static void main(String[] args) { // إنشاء شخصين Person p1 = new Person("Sara", 20); Person p2 = new Person("Ahmed", 17); // التعريف p1.introduce(); p2.introduce(); // عيد ميلاد Sara p1.birthday(); p1.introduce(); // هل هم بالغون؟ System.out.println("Sara بالغة؟ " + p1.isAdult()); System.out.println("Ahmed بالغ؟ " + p2.isAdult()); } }
اسمي Sara وعمري 20 اسمي Ahmed وعمري 17 🎂 عيد ميلاد سعيد Sara! عمرك الآن 21 اسمي Sara وعمري 21 Sara بالغة؟ true Ahmed بالغ؟ false
لاحظ النقطة المهمة:
لم نكتب p1.age = 21 مباشرةً — بل استخدمنا p1.birthday(). هذا هو الفرق بين OOP والكود التقليدي — التعديل يمر عبر سلوك الكائن نفسه.
مقارنة — الأسلوب التقليدي مقابل OOP
لترى الفرق الحقيقي، قارن الطريقتين في كتابة نفس البرنامج:
❌ الأسلوب التقليدي
// متغيرات مبعثرة String name1 = "Sara"; int age1 = 20; String name2 = "Ahmed"; int age2 = 17; // تعديل مباشر — غير محمي age1 = age1 + 1; // طباعة يدوية System.out.println(name1 + " - " + age1); System.out.println(name2 + " - " + age2);
✅ أسلوب OOP
// كائنات منظمة Person p1 = new Person("Sara", 20); Person p2 = new Person("Ahmed", 17); // عبر السلوك — آمن ومنظم p1.birthday(); // طباعة عبر Method p1.introduce(); p2.introduce();
لماذا OOP أفضل؟
لماذا هذا الأسلوب أفضل للمبتدئ؟
تفكير بالأشياء لا بالمتغيرات
بدل التفكير في "متغير اسم وآخر عمر"، تفكر في "شخص له اسم وعمر وسلوك". هذا أقرب لطريقة تفكير الإنسان.
حماية البيانات تلقائياً
private + Methods تمنع إدخال قيم خاطئة — عمر سالب، اسم فارغ. الكود يحمي نفسه.
سهولة التوسع
أي ميزة جديدة = Method جديدة فقط. بدون تغيير بقية الكود. هذا أساس المشاريع الكبيرة.
تمرين — طوّر كلاس Person 💪
🎯 المطلوب منك
أضف Method اسمها changeName
تستقبل اسماً جديداً وتغيّره — مع شرط أن الاسم ليس فارغاً.
public void changeName(String newName) { if (!newName.isEmpty()) ...}
Method isAdult() موجودة — استخدمها
أنشئ شخصاً عمره 15 وآخر عمره 20 وتحقق من isAdult() لكل منهما.
أنشئ 3 أشخاص مختلفين
واطبع تعريف كل واحد منهم باستخدام introduce().
أخطاء شائعة عند المبتدئين ⚠️
نسيان public قبل Methods
❌ خطأ
void introduce() {...}
لا يمكن استدعاؤها من main
✅ صحيح
public void introduce() {...}
نسيان إنشاء كائن قبل استدعاء Method
❌ NullPointerException
Person p;
p.introduce(); // p فارغة!
✅ صحيح
Person p = new Person(...);
p.introduce();
الخلط بين this.name والمعامل name
this.name
← خاصية الكائنname
← المعامل الوارد في Constructorthis.name = name
← خزّن المعامل في الخاصية ✅
📋 ملخص الدرس
الكلاس = بيانات (Fields) + سلوك (Methods)
السلوك عبر Methods — لا تعديل مباشر للبيانات
private + Methods = حماية وتنظيم
كل كائن مستقل بسلوكه الخاص
⏭️ في الدرس القادم:
سنختم الدورة بملخص شامل لكل ما تعلمته وخطة واضحة للخطوات القادمة في رحلتك البرمجية. 🎓