/Java Programming: Let's Master 7/ii

Java Programming: Let's Master 7/ii

Java Programming: Let’s Master 7/ii

احنا اتكلمنا المرة اللي فاتت عن مصطلحات كانت جديدة علينا زي كلاس وأوبجكت وكيفية اشتقاق اوبجكت من كلاس عن طريق الـ constructor ومقدمة عن لغة الـ UML وطريقة تمثيل الكلاسات بها.. وان شاء الله معادنا النهاردا نكمل في الـOOP  ونكمل شابتر 7.

7.6. Static Variables, Constants, and Methods

المتغير اللي عملناه قبل كده بأسم radius ده بنسميه Instance variable بمعني انه بيتبع object واحد فقط من الكلاس زي كده :


كلا من الـ radius بتاع circle1 والـ radius بتاع circle2 مفصولين عن بعض و اي تغيير بيحصل في اي واحد فيهم التاني مش بيتأثر بيه خالص والعكس صحيح.
لو عاوزين نخلي المتغيرات تتشارك في نفس الداتا بنعرفهم علي انهم static وده معناه ان كل المتغيرات بتشترك في مساحة عامة من الميموري واي تغيير بيحصل في اي واحد منهم بيأثر علي الباقي. وبالمثل زي ما فيه static variables فيه برده static methods ودي بقدر اناديها من غير مااعمل object من الكلاس. وده لأنها مش بتخص أوبجكت بعينه، لا، بتكون على مستوى الكلاس.
لو جينا نعدل علي كلاس الcircle  ونزود متغير static هنسميه numberOfObjects هنستخدمه في عد عدد المتغيرات اللي تم عملها في الكلاس. بمعني ان لما عملنا اول object كان numberOfObjects  بيساوي 1 وهكذا وهنعمل ميثود static وهنسميها getNumberOfObjects()  ودي رسمة ال UML للكلاس ونلاحظ ان المتغيرات والميثودس الstatic  تحتها خط :


علشان اعرف متغير او ميثود علي انهم static بكتب كلمة static قبل تعريف نوع المتغير او الميثود زي كده :


لأن المتغيرات الثابتة بتبقي متاحة لكل الobjects  في الكلاس فكان لازم انها تتعرف علي انها final static  ومثال عليهم المتغير PI في كلاس الMath :

وبكده هيبقي شكل كلاس الcircle كده :

 

وده الكلاس اللي هنختبر بيه القيم :

 

Visibility Modifiers

الجافا بتوفر modifiers كتير علشان التحكم في المتغيرات والداتا ومن اشهرهم ال public و ال private .
– Public : وده الوضع العام يعني زي مامعناه بيقول كده اي كلاس يقدر يشوف البيانات والمتغيرات والميثودس الخاصين بالكلاس ده.
– Private : وبرده زي مامعناه بيقول مفيش اي كلاس يقدر يشوف او يتعامل مع بيانات او متغيرات او ميثودس الكلاس ده. يعني المتغيرات أو الميثودس دي تخص الكلاس اللي هي مُعلنة فقط.
– لو لم يتم تحديد اي modifier إذا في الحالة دي بس اللي يقدر يشوف ويتعامل مع المتغيرات والبيانات والميثودس الخاصة بالكلاس ده هما الكلاسات اللي معاه في نفس الpackage فقط لا غير وبيبقي اسم الmodifier في الحالة دي إما default او protected.
وده مثال علي الكلام ده عملنا 3 كلاس c1,c2 and c3 :

هنلاحظ هنا ان c1 و c2 موجودين في نفس الpackage واللي اسمها p1 وc3 موجود في package تانية واللي اسمها p2 .
الvisibality modifiers  مهمتهم الأساسية هي تحديد صلاحيات الكلاسات المختلفة مع بعضهم البعض وده طبعا بيوفر حماية للبيانات. بالمختصر مفيش اي قيود من اي نوع داخل الكلاس الواحد بمعني ان الكلاس يقدر يتحكم في كل البيانات والمتغيرات والميثودس الموجوده فيه. زي كده :

7.8. Data Field Encapsulation

في بعض الأحيان بيكون من الأحسن ان قيمة المتغير تكون محمية قدر الإمكان وعلشان اوفر الحماية دي بعرف المتغيرات علي انها private وده مايسمي بال data field encapsulation وبكده امنع اي كلاس انه يغير في قيمة المتغيرات.


نلاحظ هنا اننا لما بنتعامل مع متغير private بنستخدم اتنين ميثود مهمين جدا وهما set() علشان احط فيه قيمة واسمها برده setter او mutator وبنستخدم ميثود get() علشان اخد قيمة المتغير واسمها برده getter او accssor.

*************************************************

وهنا بقا عايز أشرح مثال من عندي مش موجود في المرجع وذلك بغرض توضيح الفكرة

إحنا قولنا إن احنا بنعمل متغير private ودا بغرض حماية المتغيرات من العبث، أو إن كلاس تاني يغير قيم المتغيرات دي،، بس أنا أكيد هحتاج المتغيرات دي وانا شغال في كلاسات تانية، وفي الواقع انا هنا عندي مشكلة لأني فعلا مش هقدر انادي على المتغيرات دي في كلاس تاني غير الكلاس اللي هي متعرفة فيه!!

المثال أو المشكلة:

انا دلوقتي في القاهرة، وعايز أوصل معلومة معينة لواحد في المنصورة، بس المشكلة إن انا مش عارف أشوف الواحد اللي في المنصورة دا، عشان هو private .. يعني مش بيخرج برا المنصورة..

الحل:

إني أدور على حد من المنصورة يكون public .. يعني بيخرج برا المنصورة، هيخرج من المنصورة وانا هشوفه في القاهرة وأعرف انادي عليه من هنا، وهبعت معاه المعلومة للشخص اللي في المنصورة اللي هو private .. طبعا هتقولي الحد التاني هيشوف الأول ازاي إذا كان الأول private؟؟ هقولك لا طبعا هيشوفه، لأنه الحد التاني دا من المنصورة برضه، بس public يعني بيخرج من المنصورة يتشاف برا، لكن هو من المنصورة أصلا وبيشوف كل الناس اللي في المنصورة حتى لو private..

تمام أوي كدا..

يلا بسرعة نرجع للبرمجة والجافا:

بالظبط المشكلة اللي انا حكيتها دي هي اللي عندنا في الجافا فيما يخص الـ encapsulation

انا عايز متغير private في كلاس تاني،، بس انا مش عارف انادي عليه من هنا، فهبعتله المعلومة مع ميثود public معاه في نفس الكلاس بتاعه، ولكن زي ما قولت، الميثود public ، فهقدر أشوفها من عندي وأبعت المعلومة معاها للمتغير الprivate..

يارب تكون المعلومة وصلت، ويكون المثال واضح..

الجزء دا مهم جدا يا جماعة،، اللي عنده فيه استفسار يبلغني

*************************************************

7.9. Immutable Objects and Classes

لما بنعمل object ومحتوياته مش بنقدر نغيرها بيبقي اسمه في الحالة دي immutable object والكلاس اللي هو موجود فيه بيبقي اسمه immutable class بمعني اننا لو شيلنا ميثود set() من الكلاس ده معناه اننا مش هنقدر ندخل اي قيم للobject .

Passing Objects to Methods

احنا كنا عرفنا ازاي نـpass  قيمة او متغير لميثود طيب هل ممكن ابعت او pass الobject  بنفس الطريقة؟؟؟ الإجابة ممكن طبعا وهعامله معاملة الarray  بالظبط لأنه ال object بيحمل reference  لمكان ال object ده في الميموري زي ماقولنا قبل كده. وده مثال :


7.12. The this Keyword

احيانا بيفضل اننا بدل ما نعمل كل شوية object ونحجز مساحة من الميموري وكده اننا نعمل object ولكن بيكون hidden بإستخدام كلمة this وبيعامل معاملة الobject العادي وبنستخدمها في ميثود ال set زي كده :

  1. Class Abstraction and Encapsulation

زي مااتعلمنا في شابتر الميثودس ازاي نفصل جسم الميثود عن باقي الكلاس نقدر نعمل كده برده بس علي مستوي ال كلاسات وبعضها وده بيبقي اسمه abstraction وفي الطريقة دي بنعرف بنوصف بس الكلاس بيعمل ايه والuser بيستخدم المتغيرات والميثودس اللازمة ووصف الكلاس مع شغل الuser عليه بيعملوا مايسمي بال class’s contract وده طبعا بيتيح للمستخدم انه يستخدم الكلاس من غير ما يعرف اتكتب ازاي بمعني ان المتغيرات والميثودس بتبقي مخفية وده مايسمي بال encapsulation .

وبكده نكون خلصنا شابتر 7، وأخدنا فكرة موسعة أكتر عن البرمجة بتقنية الـ OOP في الجافا.

وبحب دايما أقول ان اللي هيفهم OOP تمام،، هيكون متميز في مراحل الكورس الجاية زي الـ  GUI  وغيرها..

ودايما بقول إن الـ OOP طريقة تفكير أكتر من إنها تحصيل دراسي..

أي استفسارات انا موجود

It’s totally free to share

Thx, CATaZine

Thx, CATReloaded

Om4rezz