كما بينا في درس الكائنات نستخدم الاصناف لتعريف انواع جديدة، تعتبر الاصناف بالنسبة للكائنات وكائنها المخطط (blueprint) الذي ننشأ على اساسه الكائنات في البرنامج.
قواعد الكتابة Syntax
- تستخدم كلمة class لتعريف الاصناف ثم يتبعها اسم الصنف الجديد
- يتم تعريف كل صنف class في ملف file منفصل ويكون اسم الملف هو اسم الصنف، فمثلا اذا اردنا ان نعرف صنف للطلاب واسمه Student يتم انشاء ملف كالاتي Student.java مثال
public class Student{ // (attributes) نعرف الصفات String name; int age; // (constructor) نعرف دالة البناء Student(){ name = ""; age = 0; } // (methods) نعرف الطرق public void study(){ } }
ملحوظة: من المعتاد ان يبدأ اسم الاصناف بحروف كبيرة (capital).
دالة البناء Constructor
هي نوع خاص من الدوال تقوم الجافا باستخدامه مرة واحدة عند تهيئة Initialization الكائنات اي عند استخدام كلمة new، ولا نستطيع منادته مرة اخرى.
Student s1; s1 = new Student();
اي انه عند تنفيذ السطر الثاني تقوم الجافا بمنادة دالة التعريف الموجودة في تعريف الصنف اي انه في هذا المثال يكون قيمة age تساوي 5.
قواعد كتابة Syntax دالة البناء
- يكون اسم دالة البناء Constructor مطابق لاسم الصنف (class).
- ممكن ان تحتوي دالة البناء على اكثر من معامل (parameter) .
- ممكن ان نعرف اكثر من دالة بناء في الصنف و لكن يجب ان يكون عدد المعاملات parameter مختلفة او من انواع مختلفة و يسمى تحميل overloading.
- تعريف دالة البناء هو امر اختياري*.
- اذا قمنا بتعريف دالة بناء او اكثر يجب استخدام احدهم.
اذا لم نعرف دالة بناء تقوم الجافا بتعريف دالة بناء فارغة عند عملية التحويل البرمجي (Compilation) و تسمى دالة البناء الافتراضية (Default constructor).تشغيل
public class Teacher{ String name; int age; Teacher(String teacherName){ name = teacherName; age = 0; } Teacher(String teacherName, int teacherAge){ name = teacherName; age = teacherAge; } } Teacher teacher1 = new Teacher("Ahmed"); // {name: "Ahmed", age: 0} Teacher teacher2 = new Teacher("Ahmed",35); // {name: "Ahmed", age: 35} Teacher teacher3 = new Teacher();// Error
في المثال السابق عرفنا اكثر من دالة بناء، احدهم يستقبل معامل واحد وهو الاسم و الاخر يستقبل العمر و الاسم، عند القيام بتهيئة العناصر يحدث في السطر 22 خطأ (Error) لاننا لم نستخدم احد من دوال البناء التي تم تعريفهن.
الكلمة الخاصة this
this هي احد الكلمات الخاصة (Keyword) في لغة الجافا ويتم استخدامها اذا اردنا ان نشير الى الكائن اثناء تعريف الصنف، مثال
public class Animal{ String name; Animal(){ name = "Dog"; this.name = "Dog"; } }
في المثال السابق السطرين الخامس و السادس يقومان بنفس الامر، فبدون كلمة this تكون الصفة name تشير الى الصفة (attribute) التي ستكون في الكائن الذي يتم تكوينه. اذن متى سيكون هناك فرق؟
public class Animal{ String name; Animal(String name){ this.name = name; } } Animal animal = new Animal("Dog");//{name: "Dog"}
في هذا المثال عند تعريف دالة البناء تم استخدام المعامل باسم name، اذن اذا استخدمنا name فهنا تشير الى ذلك المعامل، ولن نستطيع ان نستخدم صفة الكائن name الا اذا استخدمنا كلمة this .
الكلمة الخاصة static
احد الكلمات الخاصة keywords في الجافا هي static وهي احد معدلات الوصول access modifier، تستخدم static لجعل الصفات (attributes) او الدوال مشتركة على مستوى الصنف ويطلق عليها اسم متغيرات الاصناف class variables، بمعنى اننا اذا غيرنا قيمة ذلك المتغير من كائن ستتغير قيمته في كل الكائنات من نفس الصنف.
لكي نفرق ما بين المتغيرات الاعضاء member variables و متغيرات الصنف class variables نرى المثال الاتي
class Main { int memberVariable; static int classVariable; public static void main(String[] args) { Main a = new Main(); Main b = new Main(); a.memberVariable = 5; a.classVariable = 5; b.memberVariable = 10; b.classVariable = 10; System.out.println(a.memberVariable); // 5 System.out.println(a.classVariable); // 10 } }
كما لاحظنا في السطر 17 و 18 فالمتغيرات الاعضاء تكون منفصلة من كائن (object) لكائن اخر، اما متغيرات الاصناف فهي مشتركة على مستوى الصنف كله واذا تغيرات قيمتها في كائن تنعكس في الكائنات الاخرى.
تقوم الجافا بتخزين متغيرات الاصناف (class variables) في مكان مختلف عن مكان تخزين الكائنات (Objects) ولا يتم انشاء متغير لكل كائن بل هو متغير واحد على مستوى الصنف.
هناك طريقة اخرى لاستخدام متغيرات الاصناف (class variables) وهي الطريقة الشائعة، وتكون باستخدام اسم الصنف وليس الكائن كالتي
class HelloWorld{ static String message = "Hello World!"; public static void main(String[] args){ System.out.println(HelloWorld.message);// Hello World! } }
ايضا تستخدم كلمة static مع الطرق / الدوال و تعتبر تلك الطرق مشتركة ايضا على مستوى الصنف وليست خاصة بكل كائن لذلك لا نستطيع ان نستخدم داخلها متغيرات الاعضاء member variables لكن نستخدم داخلها متغيرات الاصناف فقط، مثال
class Example{ static int counter = 0; static void incrementCounter(){ counter ++; } public static void main(String[] args){ Example.incrementCounter(); Example.incrementCounter(); System.out.println(Example.counter); // 2 } }
مبادئ البرمجة الكائنية في الجافا (Java OOP Principles)
هناك 4 مبادئ رئيسة للبرمجة الكائنية في لغة الجافا وهي تساعدنا في تنظيم وهيكلة برامج الجافا وهم
- التوريث (Inheritance)
- التشكل (Polymorphism)
- التجريد (Abstraction)
- التغليف (Encapsulation)