المجلس اليمني ... يمن واحد وآراء متعددة
::  قوانين المنتدى  |     التسجيل  |   طلب رقم التنشيط   |   تنشيط العضوية  |  استعادة كلمة المرور
العودة   المجلس اليمني :: العلمية والتقنية :: الكمبيـوتر والانتـرنت
 
أدوات الموضوع
11-12-2006, 05:54 PM   مشاركة رقم :: 1
عضو فعّال
 
لا توجد صورة


تاريخ التسجيل: 26-09-2006
المشاركات: 962

افتراضي دروس في لغه الجافا




بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته


الدرس رقم 0 ( للمبتدائين):
عناصر الدرس:
• ماهي لغات البرمجة؟
• لماذا الجافا ؟
• البداية :
- JAVA VIRUAL MACHINE
- أين اكتب كود الجافا , وكيف انفذه؟
الشرح :

* لغات البرمجة : عندما تريد ان تتخاطب مع أي انسان آخر لابد ان يكون هناك لغة مشتركة تعرفونها حتى يستطيع كل من الطرفين فهم الآخر وتلبية طلباته وما الى ذلك ,
ولغات البرمجة بالقياس هي وسيلة للتخاطب مع الأجهزة الإلكترونية وبخاصة الكمبيوتر.

هناك العديد من لغات البرمجة الموجودة حالياً , ولكن هناك قواسم مشتركة بين هذه اللغات يمكن النظر اليها من ناحيتين كالتالي:

الناحية الاولى : قربها وبعدها عن مستوى فهم الانسان او الكمبيوتر ويمكن تقسيم لغات البرمجة الى :

- لغة الآلة ((machine language وهي اللغة التي يستطيع الكمبيوتر تنفيذها مباشرة دون تحويل وتتكون من سلاسل من الـ 0s والـ 1s , ولكنها صعبه جداً للتعامل البشري.

- لغة التجميع ((Assembly language او مايسمى بـ (low level languages) وهي عبارة عن لغة رمزية اقرب تتوسط لغة الآلة والمستويات الأخرى في قربها من الكمبيوتر وإمكانية فهمها , وكي يتم تشغيلها على الكمبيوتر لابد من وجود Assembler لكي يقوم بتحويل الكود الى حالة الـ machine language

- (High Level Languages) وهي لغات الجيل الثالث كالـ C /C++ و Java وغيرها, ولغات الجيل الرابع كـ SQL وهي أقرب الى فهم البشر ولابد من تحويلها الى لغة الآلة لتنفيذها وهذا يتم عن طريق المترجمات الخاصة.
الناحية الثانية : هناك مفهومين مهمين لابد من التعرف عليهم حتى تتمكن من تعلم لغة برمجة معينه هما:

المفهوم الاول : Syntax وهو عبارة عن قواعد اللغة وتتكون من مفردات وطريقة معينه لإستخدامها ولايمكن لأي كود ان ينفذ وهو حاوي لـ Syntax Errors.

المفهوم الثاني : Symantec وهو عباة عن معنى هذه القواعد وتركيباتها , وهذا الجزء يعتمد بشكل اساسي على المبرمج ويمكن تشغيل كود حاوي على Symantec Errors دون حدوث مشاكل فنيه ولكن بالطبع سيكون هناك مشاكل في مايقوم به هذا البرنامج.

إن شاء الله سبحانه وتعالى خلال شرحنا للجافا سنتظرق لهذه المفاهيم ليزداد فهمنا لها مع وجود امثله وتطبيق عملي.
* لماذا الجافا ؟

تتميز الجافا بأنها مستقلة عن نظم التشغيل , وعليه ممكن يشتغل كود الجافا في الويندوز واللينكس والموبايل وغيرها من الـ platforms , لذلك تلاحظ عدم تكون ملف تنفيذي للكود عندما تشغلة في منصة الويندوز مثلاً وانما يتكون .class file وبالتالي ربما تلاحظ بطء نسبي عند تشغيل كود الجافا ولكن مقارنة بميزة الإستقلالية نخلص الى اهمية لغة كالجافا.

تدخل الجافا في الـ mobile applications and web applications بشكل كبير جداً.

وتتميز الجافا بانها Full Object Oriented Programming Language وهي طفرة ظهرت بعد لغة السي بلس بلس كما سيأتي.

متطلبات الشغل بالجافا متوفرة مجاناً على الانترنت بخلاف بعض اللغات التي يتطلب شراء بعض المتطلبات بتكلفة باهضة وخاصة للشركات والمؤسسات.

والعديد من الميزات الأخرى التي تدفع لإتخاذ الجافا هي اللغة الاساسية للشغل لدى المبرمج.
* البداية :

من أجل كتابة كود جافا لابد من وجود بعض المتطلبات كالتالي :
- Java Virtual Machine : كما قلنا سابقاً ان الجافا تتميز بإستقلاليتها عن انظمة التشغيل , لذلك كان لابد من وجود virtual machine لتلعب دور الوسيط بغض النظر عن نوع نظام التشغيل , ولايمكن تشغيل كود جافا في حالة عدم وجود java virtual machine على الجهاز.

بالإمكان تحميل الـ Java Virtual Machine مع الـ JDK version 5.0 وهو تقريبا اخر اصدار منتشر وهناك الاصدار الجديد 6.0 ولكن لايزال محدود الانتشار , وعموماً هناك ميزة في الجافا ان كل اصدار يحوي الاصدارات اللي قبلة حتى في حالة تعديل بعضها.



للتحميل من هنا

وبعد الإنتهاء من التحميل يمكنك البداء في تشغيل اكواد الجافا بسهولة.
- أين اكتب كود الجافا , وكيف انفذه ؟

بالإمكان كتابة كود الجافا في العديد من المحررات Editors او حتى في الـ note bad ومن أمثلة هذه الـ Editors :
* Eclipse
* JBuilder
* JCreator
* netBeans

وغيرها , نحن هنا إن شاء الله سنستخدم الـ Eclipse لمايتميز به من سهولة التعامل والـ Features الرائعة الموجودة به.



للتحميل من هنا
والآن اصبح كل شي جاهز للبدايه بكتابة اول كود.

لكتابة الكود اتبع الخطوات التالية :
* new project واعطة اسم.
* new file اعطة أسم بالشروط التاليه :
- الحرف الاول من اسم الفايل يحبذ ان يكون كابتل (ليس ضرورياً) سنعرف السبب لاحقاً.
- يجب ان يكون الفايل بالإمتداد java. مثال اسم فايل صحيح First.java
* بعد فتح الفايل إبداء بكتابة الكود التالي :

Public class First
{
Public static void main(String[] args)
{
System.out.print("Hello Ebnalyaman");
}
}


طبعاً اسم الـ class هنا هو First عشان اسم الفايل هو First.java ولابد من ذلك , أي لابد من ان يكون اسم الكلاس الرئيسي (الذي يحتوي الـ main method ) بإسم الفايل.

الأن يمكنك تشغل الكود السابق لطباعة كلمة "Hello Ebnalyaman" على الشاشة.



والـ output console



ملاحظات :

* تلاحظ ان الـ Eclipse يترجم الكود بعد كل عملية حفظ للكود Ctrl + S ويضع خط احمر تحت الخطأ , ولمعرفة نوع الخطأ ضع الماوس على السطر او على العلامة الموجودة في بدايه السطر من الشمال كما في الصورة.


وقبل الختام لي تعليقين :



أتمنى ان تكون المعلومات واضحة , وإن شاء الله سبحانه وتعالى نلتقي في الدرس القادم ودائماً نتذكر التطبيق هو الأساس.


ادعوا لاخوكم هذه هي الحاجه الوحيده المطلوبه


 
11-12-2006, 05:57 PM   مشاركة رقم :: 2
عضو فعّال
 
لا توجد صورة


تاريخ التسجيل: 26-09-2006
المشاركات: 962

افتراضي




بسم الله الرحمن الرحيم

الدرس الثاني: Object Oriented Programming

عناصر الدرس :
*** classes
* ?what and why
* constructor
* methods
* data items
* access modifiers
* static and final keywords
* this and super keywords
*** objects
* what
* Object variable
* Object initialization
* using of objects
الشرح :

*** Classes :

* كمانعلم ان مقتضيات الـ OOP وجود الـ classes في تركيبة الكود , الـ class هو عبارة عن هيكل يُعرفه المبرمج ,
ويحتوي هذا الهيكل على methods وايضاً data items كـ integer, float, string وما الى ذلك.

دعونا نأخذ المثال التالي : بالإمكان تعريف متغير ذو نوع float في الكود مباشرة , طيب لو كنا عايزين نعرف متغير ذو نوع Human
وبالتأكيد لابد ان يكون هذا المتغير يحاكي في صفاته الـ Human مثل الحركة والقيام والأكل وغيرها , ولديه ايضاً بعض المعلومات الخاصة كـ الاسم والعمر والطول وغيرها ,,, بإمكاننا في الـ OOP عمل كلاس وليكن اسمه Human ونقوم داخلة بتعريف methods كل method تقوم بأداء عمل معين يقابل صفة معينه مثلاً يكون لدينا method اسمها ()move
واخرى اسمها ()eat وهكذا , وايضاً نعرف متغيرات كـ ;String name وايضاً ;int age وغيرها ,
وبهذا نكون تمكنا من جعل برمجتنا محاكاه للواقع وهذا ماتميز به الـ OOP.
يمكن عمل كلاس كالتالي :


class MyClass
{
}

وبداخل الكلاس نقوم بتعريف الـ methods والـ data items المطلوبة كما سيأتي.
* constructor : هو عبارة عن method خاصة تستخدم لغرض الـ initialization للـ objects ,
بداخله يمكن كتابة الكود المطلوب تنفيذة عند بداء تعريف الـ object وقبل بداء استخدامه, يميز الـ constructor بأن لديه نفس اسم الكلاس بتاعة ,
ويمكن عمل اكثر من constructor داخل الكلاس الواحد بحيث يحتوي كل واحد arguments مختلفة إما بالعدد او بالنوع او بكليهما كما يلي.

class MyClass
{
	public MyClass()
	{
  // do some things
	}
	
	public MyClass(int i)
	{
  // do some things
  this.i = i; // i of my class = i arguments
	}
	
	public MyClass(float f)
	{
  // do some things
	}
	
	public MyClass(int i,int j)
	{
  // do some things
	}
}

وهناك default constructor في حالة عدم تعريف أي constructor فإنه يعتبر معرفاً ضمنياً وهو الذي لايحتوي على اي argument , وعليه يكمن عمل كلاس من غير تعريف اي constructor لوجود الـ default.
* methods : يمكن تعريف العديد من الـ methods بداخل الكلاس , تتبع الـ method نفس القواعد المعروفه في الـ C++ مثلاً , انظر الى المثال التالي :

void fun1(int i)
	{
  // do some things
	}

نلاحظ ان الـ method لديها return type ولديها اسم ولديها arguments ولديها body ,
وهناك بعض الأضافات المضافة للـ methods يمكن وضعها ويمكن الاستغناء عنها بحسب الغرض منها كما سيأتي.

ويمكن تعريف اي عدد من الـ methods بداخل الـكلاس بشرط عدم التكرار , اعني بالتكرار اي تكرار نفس الاسم ونفس الـ arguments بنفس الـ types.
* data items : يمكن ايضاً تعريف العديد من الـ data items بداخل الكلاس , كما تكلمنا في الدرس السابق , انظر الى المثال التالي :

class MyClass
{
	void fun1(int i)
	{
  // do some things
	}
	
	int i; // by defautl i = 0
	int u = 5;
	String str = "my string";
	String s; // by defautl s = null
	double d = 5.3;
	float f; // by default f = 0.0
}

وهناك بعض الاشياء المضافة لتعريف الـ Data member ستأتي , ويمكن تعريف اي عدد من الـ data members بداخل الكلاس بشرط عدم التكرار,
اعني بالتكرار هنا عدم تكرار الاسم.

------------------

* Access Modifiers :

يتم تحديد الـ scope المدى الذي يمكن استخدام الـ method او الـ data item بداخلة , ويمكن تقسيمها الى الانواع التالة :

- public : ومعناه ان الـ method او الـ data member بالسواء يمكن استخدامها من اي مكان في الـكود
أي انها تكون global , وبالتلي لو كان لدينا method نريد استخدامها من الـ main method او من داخل كلاس اخر فلابد ان نجعل هذه الـ method عبارة عن public ونفس النظام بالنسبة للـ data items , انظر الامثلة التالية :

class MyClass
{
	public void fun1()
	{}
	
	public int i=5;
}

- private : ومعناه ان الـ method او الـ Data member يمكن استخدامها فقط من داخل الكلاس , يعني من الـ methods المعرفة بداخل الكلاس ,
ولايمكن استخدامها مع كلاس آخر , انظر الامثلة التالية :

class MyClass
{
	private void fun2()
	{}
	private int i=5;
}

- protected : مؤقتاً يمكن اعتبار هذا النوع كأنه private لان الفرق سيظهر عندما نتكلم عن الـ inheritance في الدرس القادم ان شاء الله.

---------------------

* static : يمكن وصف method او data item بأنه static كمافي المثال التالي :

class MyClass
{
	public static void fun()
	{}
	
	public static int i;
}

طبعاً في الحالات السابقة التي لم نستخدم فيها Static لايمكن استخدام الـ methods و الـ Data items على مستوى الكلاس , وانما على مستوى الـ objects
اي لابد من تعريف object كماسيأتي ومن خلال هذا الـ object يمكننا عمل accessing للـ members
سواء كانوا methods or data items.

في حين الـ static field يمكن استخدامه على مستوى الـ class انظر المثال التالي :

public class OOP
{
	public static void main(String[] args)
	{
  MyClass m = new MyClass(); 
  
  // we have class named MyClass 
  // and object named m
  
  m.fun1(5);
  int x = m.i;
  m.fun3(); // we can access static field by object level
  
  MyClass.fun1(5); // Error, can not access non-static field by class level
  MyClass.fun3();
  int y = MyClass.i;
	}
}

class MyClass
{
	public void fun1(int i)
	{}
	
	public static void fun3()
	{}
	
	public static int i;
}

طبعاً من الواضح انه عند تعريف objects فإن جميع الـ non-static members سواء methods or items يتم تكرارها لكل object في الـ memory ويكون لكل object الـ members الخاصة به , في حين الـ static members يتم التعامل معها على مستوى الـ class فيوجد واحدة فقط لجميع الـ objects.

دعونا نتخيل المثال التالي : لو كان لدينا كلاس اسمه X ولدينا tow objects of X اسمهما obj1 and obj2 وكان لدينا داخل الكلاس non-static item called i ولدينا static item called j , وكانت القيم الابتدائية لكل منهما صفر فإنه بعمل التالي :

X obj1 = new X();
  X obj2 = new X();
  
  obj1.i++;
  obj2.i++;

فإن لدينا في الـ memory مكانين اسمهما obj1.i and obj2.i وكلاهما ذو قيمة تساوي الواحد , في حين لو نفذنا التالي :

X obj1 = new X();
  X obj2 = new X();
  
  obj1.j++;
  obj2.j++;

فإنه لدينا في الـ memory مكان واحد اسمه X.j ويمكن يكون obj1.j or obj2.j ولديه قيمة تساوي 2.
وبالتالي نأخذها قاعدة من الأفضل التعامل مع الـ static members على مستوى الـ classes منعاً للإرتباك.

قد يتسأل البعض مافائدة الـ static وان شاء الله عندما بنداء نطبق ونعمل برامج ومشاريع ستصادفنا مواقف نكون بحاجة ماسة لشي كالـ Static.
* final : تستخدم لتعريف ثابت وهي تماثل كلمه const في الـ C++, كالتالي :

public final int y = 5;
	public final static int z = 6;

وطبعاً لابد من اعطاء القيمة عند التعريف ولايمكن تغييرها في الـمستقبل.
مثال :

لدينا كلاس يدعى Math موجود في الـ package التي تدعى java.lang وهي كما تكلمنا سابقاً imported by default يحتوي هذا الكلاس على العديد من الـ static methods وايضاً الـ final static items ويمكن استخدامها كالتالي :

public class OOP
{
	public static void main(String[] args)
	{
double d;
  
  d = Math.sin(90);
  d = Math.cos(45);
  d = Math.cos(90);
  
  d = Math.PI; // PI is final static dobule PI = 3.14
  d = Math.E; // exp. is final static double E = ( e value)
	}
}

وطبعا يمكننا عمل كلاس له نفس الخواص او حتى اكثر.

-------------
* this : هي عبارة عن pointer بيشاور على الـ current running object وبإستخدامه يمكننا معرفة الـ members الموجود داخل الكلاس واستخدامها
وذلك بكتابة .this وعندها سيظر لنا اسماء الـ members الموجوده ويمكن استخدامها طبيعياً وكأن كلمة this ماهي الـ object , انظر للمثال التالي :

public MyClass(int i)
	{
  this.i = i; // i of my class = i arguments
	}

وسنتظرق لـ this مرة اخرى عندما نتكلم عن الـ inner classes إن شاء الله في الدروس القادمة.
* super : سأترك الحديث عنها مؤقتاً لحين شرح الـ inheritance في الدرس القادم.
وبهذا نكون قادرين على عمل كلاس حسب الطلب.
------------------------------------------------
*** Objects :

الـ object هو عبارة عن variable له نوع او type معين هذا النوع هو عبارة عن كلاس.

لو إستطعنا مجازاً النظر الى المثال التالي ;float f فإن كلمة float هنا تماثل معنى الـكلاس في حين كلمة F تماثل معنى الـ object مع مراعاة الفارق.

* Object variable : يمكننا تعريف object كالتالي :

MyClass myObject;

في هذه الأثناء الـ object المسمى بـ myObject موجود في الـ memory ولكن بدون ان يشاور على اي real object بمعنى اخر الـ object بمحتوياته من methods and items غير موجودة في الـ memory بعد. وبالتالي لو حاولنا استخدام الـ object مباشرة سوف نلاحظ الـRun time Errors كمايلي :

public static void main(String[] args)
	{	
  MyClass myObject;
  myObject.fun1(2); // will produce run time error here
	}

* object initialization : الان يمكننا عمل initialization للـ للـ object كالتالي :

public static void main(String[] args)
	{	
  MyClass m = new MyClass();
  m.fun1(2);
	}
يمكننا استخدام اي constructor معرف داخل الكلاس بما فيهم الـ default حسب الغرض او الطلب , وفي هذه الأثناء يكون الـ object موجود physically في الـ memory , وعليه يمكننا استخدامه مباشرة .
ويمكننا ايضاً عند تعريف object مساواته بـ object آخر موجود فعلاً في الـ memory كمايلي :

public static void main(String[] args)
	{	
  MyClass object1 = new MyClass();
  myClass object2 = new MyClass();
  myClass object3;
  
  object1 = object2; // object1 and object2 point the same ********
  object3 = object2; // and object3 also
  
  object3.fun1(2); // OK.
	}

الذي سيحدث يمكن توضيحة بالصورة التالية :



نلاحظ ان الـ object الاول لم يعد هناك اي Handle عليه وبالتالي يظهر هنا مايسمى بالـ garbage collector
ويقوم بعمل de-al******** لهذه المساحة من الـ memory حتى يمكن استغلال الـ memory بطريقة أفضل.

طبعاً لايمكن عمل de-al******** للـ object الا عندما يكون استخدامه او إعادة استخدامه مستحيلاً , بمعنى نلاحظ المثال التالي :

public static void main(String[] args)
	{	
  MyClass object1 = new MyClass();
  myClass object2 = new MyClass();
  myClass object3;
  
  object3 = object1;
  object1 = object2; // object1 not deallocated since object3 points to it.
  object3 = object1; // object3 will deallocated since thiere is no any handle to it
	}
ملاحظة : عالم الـ OOP كبير جداً ولايتم استيعابة بالشكل المطلوب الا بكثرة الممارسة.
ملاحظة : إن شاء الله سبحانه وتعالى سيكون هناك درس ملحق للدرسين الاول والثاني , وبعده سيتم انزال الدرس الثالث ,واولاً واخيراً لاننسى التطبيق هو الأساس.


 
11-12-2006, 05:59 PM   مشاركة رقم :: 3
عضو فعّال
 
لا توجد صورة


تاريخ التسجيل: 26-09-2006
المشاركات: 962

افتراضي




الدرس الثالث : ملحق.

* Arrays : هي عبارة عن مجموعة من الـ

********s في الـ memory متتالية (وراء بعضها) ولها نفس الـ type.

تعريف الـ Array في الجافا كالتالي :


int[] myArray;
في هذه المرحلة نكون عرفنا إسم الـ array فقط ولكن حجزها في الـ memory يكون بإستخدام new مع تحديد الطول كالتالي :


int[] myArray;
myArray = new int[5];
int[] myArray2 = new int[5];

- يمكن ملء الـ array عن طريق الـ loop او مباشرة عن طريق الـindexes التي تبداء من 0 الى length-1.

- لمعرفة طول الـ array يمكن استخدام الـ method التالية : length

كالتالي myArray.length

- هناك طرق اخرى لعمل initialization للـ array بدون إستخدام new

كالتالي :


int[] myArray = {1,2,5,6};
  
new int[] {1,5,6,4};
في الحالة الاولى : يتم معرفة طول الـ array من خلال عدد الـعناصر الموجودة في عملية

التعريف وهي في المثال السابق 4 عناصر , فكأننا كتبنا ;[new int[4 ويكون القيم الاولية

ليست اصفار كما في الحالات العادية وانما بالقيم الموضحة في المثال.

وفي الحالة الثانية : هذه عبارة عن anonymous array وهي array طبيعية

في ماعدا انها لاتملك اسم وتستخدم هذه الحالة عندما لانكون في حاجة الى اسم للـ array وكمثال

على ذلك لو اردنا ارسال array كـ parameter لـ method لايكون بحاجة لإسم الـ array في الغالب.
ملاحظة مهمة : لابد من الأخذ في الإعتبار عند التعامل مع الـ arrays إنها تسلك نفس مسلك الـ

objects في ناحية الـ references إنظر الى المثال التالي :


int[] myArray = {1,2,5,6};
  
int[] other = myArray;
  
other[1] = 100; // myArray will be = {1,100,5,6}

اي ان هناك array واحدة لها اسمين.

- في حالة إذا اردنا عمل copy للـ array لـ array أخرى , كما تكلمنا لايمكن

استخدام علامة = لهذا الغرض , وانما هناك طريقتين :

الاولى : التعامل مع الـ indexes.
الثانية : إستخدام الـ method التالية :

;(System.arrayCopy(from,fromIndex,to,toIndex,count
حيث أن : from : عبارة عن الـ array المراد نسخها.
fromIndex : الـ index المراد بداية النسخ منه , 0 إذا اردنا النسخ من البداية.
To : عبارة عن الـ array المراد تكوينها.
toIndex : الـ index المراد النسخ اليها, 0 إذا اردنا النسخ الى بداية الـ array.
Count : عدد العناصر المراد نسخها.
- لعمل sort لمحتوى الـ array يمكن استخدام الـ method التالية :

;(Arrays.sort(myArray طبعاً Arrays هنا عبارة عن class موجود في الـ java.util package
وبالتالي لإستخدامها لابد من عمل import لها.
-----------------------

- ArrayList : يمكن عمل dynamic List يتم فيها تخزين objects مختلفة في النوع
وليس لها طول محدود.

أنظر المثال التالي :

import java.util.*;

public class Test2
{
	public static void main(String[] args)
	{
  ArrayList list = new ArrayList();
  T10 t = new T10();
  
  // to set any type of objects
  list.add(2);
  list.add(new int[]{1,2,3});
  list.add(t);
  
  // to get any type of object
  int i = (Integer)list.get(0); // index number 0
  int[] x = (int[])list.get(1); // index number 1
  T10 tt = (T10)list.get(2); // index number 2
  
	}
}

class T10
{}
نلاحظ اننا يمكننا تخزين objects من انواع مختلفة ولكن عند إسترجاعها لابد من عمل

casting لان الـ method المسماه بـ ;(get(index بترجع object من نوع Object الذي هو super class
لكل الـ classes في الجافا, طبعاً في حالة توافق الـ cast مع الـ object الحقيقي فإن العملية تتم طبيعية في

ماعدا ذلك ينتج run time error , وبالتالي يبقى علينا فقط التأكد من الـ index

المناسب بحسب عملية الإدخال.

-----------------------------
* Multidimensional Arrays : ليس هناك اختلاف كبير بينها وبين الـ

array العادية في طريقة التعامل
انظر المثال التالي:


int[][] x = new int[2][6];
int[][] y = {{1,2},{1,1},{5,6}};
-------------------------

* Bitwise Operators : عندما تكلمنا في الدروس السابقة عن الـ

operators عرفنا ان هناك العديد من الانواع منها ايضاً الـ bitwise

operators وهي خاصة للتعامل من الـ integers حيث يتم التأثير على مستوى الـ

bits , ويمكن تلخيص هذه العمليات كالتالي:

& : and
| : or
^ : xor
~ : not
>> : shift right
<< : shift left with sing bit at top bits
<<< : shift left but with zeros at top bits

ولايوجد >>>.


 
11-12-2006, 06:02 PM   مشاركة رقم :: 4
عضو فعّال
 
لا توجد صورة


تاريخ التسجيل: 26-09-2006
المشاركات: 962

افتراضي



لدرس الرابع :

*** Inheritance and polymorphism : في هذا الدرس سوف نتطرق لصفة من أهم صفات الـ OOP وهي عملية الوراثة او مايعرف بـالـ Inheritance.

* كما علمنا اننا في عالم الـ OOP الكود عبارة عن classes تحتوي على صفات معينه متمثلة في الـ methods and items , تخيل معي لو كان هناك أكثر من class وكان لها بعض الصفات المشتركة , فإننا بالطريقة العادية سوف نقوم بتكرار هذه الصفات في جميع الـ classes ولكن بإستخدام الـ inheritance نستطيع ان نعيد استخدام صفات موجودة مسبقاُ في class معين ونستخدمة دون الحاجة الى إعادة كتابته من جديد, بالإظافة الى ذلك قدمت هذه العملية إمكانيات كبيرة متمثلة في الـ polymorphism ماكانت للتوفر لولا وجود الـ inheritance وان شاء الله نتطرق لهذا المفهوم خلال هذا الدرس.
- لنفرض ان لدينا class A به methods and items واردنا عمل class B به methods and items واردنا ايضاً تكرار الـ methods and items الموجودة في الـ class A فإننا نجعل الـ class B يرث هذه الصفات من الـ class A.

- في الجافا تستخدم extends keyword لغرض الـ inheritance كـ class A extends B أي ان class المسمى بـ A يرث الـ class المسمى بـ B.

- عملية الـ inheritance لايصح الا ان تكون من single class , اي ان الـ multiple-inheritance الموجود في الـسي++ غير موجودة في الجافا لماكانت تحتوي عليه من مشاكل , ولكنها استعيض عنها بالـ interface الذي سيأتي في الدرس القادم بإذن الله تعالى.

مثال :

public class Inher
{
	public static void main(String[] args)
	{
  C obj = new C();
  
  obj.fun1();
  obj.fun2();
  obj.fun3();
	}
}
class A
{
	public void fun1()
	{}

	public int i;
}

class B extends A
{
	public void fun2()
	{}

	public int i;
}

class C extends B
{
	public void fun3()
	{}

	public int h;
}
- access modifier and inheritance : كما تكلمنا سابقاً ان الـ methods and data items داخل الـ class يمكن إعطائها access modifier إما public or private or protected وبالإظافة الى ماتكلمنا عليه , لا بد من معرفة ان عملية الـ inheritance لاتتم الا على الـ methods and items التي هي public أما الـ private فإنها لاتكون خاصة بنفس الـ class ولايمكن وراثتها بأي صورة , اما في حالة الـ protected فهي كالـ public أي انها قابله للوراثة ولكنها تعامل داخل الكلاس الثاني –الوارث- وكأنها private وبالتالي

بالنظر في المثال التالي :


class A
{
	public void fun1()
	{}
	
	private void fun2()
	{}
	
	protected void fun3()
	{}

	public int i;
	private float f;
	protected double p;
}

class B extends A
{
	public void fun4()
	{}
	
	private void fun5()
	{}
	
	protected void fun6()
	{}

	public int j;
	protected float u;
}

class C extends B
{
	public void fun3()
	{}

	public int h;
}
نلاحظ ان الـ class A لديه الـ methods التالية :
- ()fun1 : وهي عبارة عن public method فيتم وراثتها –extended- للـ B وتظل public method في الـ class B , ولذلك يتم وراثتها ايضاً للـ class C , وكذلك بالنسبة للـمتغير public i.

- ()fun2 : وهي عبارة عن private method فلايتم وراثتها للـ class B , وكذلك بالنسبة للمتغير private f

- ()fun3 : وهي عبارة عن protected method فيتم وراثتها للـ class B ولكنها في الـ class B يتم التعامل معها كأنها private method فلايتم وراثتها للـ class C وكذلك بالنسبة للمتغير protected p.
- static fields and overrides : عند وراثة method فإنه بالإمكان إستخدامها كما هي او يمكن إعادة كتابتها , واهمية هذه العملية ستظهر عند الحديث عن الـ polymorphism ولكن مايجدر التنبيه له هو أنه في حالة الـ static method فإن الـ parent class يعمل hidden للهذه الـ method.
- final class : الـ final class لايمكن عمل extends له.
- abstract method : هي عبارة عن method لايوجد لها body كالتالي :


abstract class T3
{
	abstract public void fun1();
}
وفي هذه الحالة من المنطقي القول بإنه لابد من عمل override لها في class آخر عندما يعمل extends لهذا الـ class , وفي الحقيقة لابد من معرفة مايلي :
- non-abstract method : يمكن عمل override لها ويمكن عدم ذلك.
- abstract method : يجب عمل override لها.
- abstract class : عندما لانريد ان يكون هناك object من نوع معين من الـ classes فإننا نقوم بجعلة abstract class كما في المثال السابق , وفي هذه الحالة لايمكننا تعريف object من هذا الـ class , يمكن جعل أي class عبارة عن abstract أو عدم ذلك في حالة خلوه من اي abstract field , أما في حالة إحتواءه ولو حتى على abstract field واحد فإنها يجب ان يكون abstract class.

-----------

- في حالة ما إذا اردنا عمل call للـ constructor بتاع الـ super class من اي من الـ children classes فإننا نستخدم super() ويمكن عمل passing للـ parameters حسب الـ constructors الموجودة.
* casting : كما تكلمنا في الدروس السابقة عن الـ casting وهو عبارة عن تحويل نوع متغير الى نوع آخر, يمكننا هنا تغيير نوع الـ object الى نوع آخر بنفس الطريقة , ولكن بشرط ان يكون الـمحول عبارة عن super class للمحول اليه , انظر الى المثال التالي وانتبه للـ comments :


public class Test
{
	public static void main(String[] args)
	{
  Emp e = new Emp();
  e.fun1(); // no problem
  
  Mang m = (Mang) e; // Run Time Error
  m.fun1();
  
  Emp ee = new Mang();
  ee.fun1();
  
  Mang mm = (Mang) ee; // OK
  mm.fun1();
	}
}

class Emp
{
	public void fun1()
	{
  System.out.println("you are now at Emp class");
	}
}

class Mang extends Emp
{
	public void fun1()
	{
  System.out.println("you are now at Mang class");
	}
}
----------------------
* polymorphism : يمكننا النظر الى الـ polymorphism ببساطة بإنه حالة تواجد اكثر من method لها نفس الـ signature ولكن الـ Implementation بتاعها مختلفة , وهذه الميزة يمكن الحصول عليها بإستخدام الـ Inheritance كأن يكون لدينا super class يحتوي على method ما , والعديد من الـ sub classes تقوم بعمل override لهذه الـ method , تابع معي المثال التالي , وانظر الى ماذا سيحدث في الـ main.


public class Main
{
	public static void main(String[] args)
	{
  MySuper[] obj = new MySuper[3];
  
  obj[0] = new MySubClass1();
  obj[1] = new MySubClass2();
  obj[2] = new MySubClass3();
  
  for(int i=0;i<obj.length;i++)
  	obj[i].output();
	}
}

class MySuper
{
	public void output()
	{}
}

class MySubClass1 extends MySuper
{
	public void output()
	{
  System.out.println("you are in first subclass");
	}
}

class MySubClass2 extends MySuper
{
	public void output()
	{
  System.out.println("you are in second subclass");
	}
}

class MySubClass3 extends MySuper
{
	public void output()
	{
  System.out.println("you are in third subclass");
	}
}
--------------------------------
* Overloading : هذا المصطلح يعني أن يكون هناك العديد من الـ methods لها نفس الإسم ونفس الـ return type ولكن يتم التفريق بينها من قِبل الـ compiler بأحد امرين :
- إختلاف عدد الـ parameters.
- إختلاف الـ types بتاع الـ parameters.

أنظرالمثال التالي :


class MyClass
{
	public void fun()
	{}
	
	public void fun(int i)
	{}
	
	public void fun(float f)
	{}
	
	public void fun(int i,int x)
	{}
}



 
24-12-2006, 05:12 PM   مشاركة رقم :: 5
مشرف_الكمبيوتر والانترنت

الصورة الرمزية امين وبس


تاريخ التسجيل: 26-10-2002
المشاركات: 12,539

افتراضي

جميل تابع الدروس سوف نتعلم منك

 
24-12-2006, 10:21 PM   مشاركة رقم :: 6
عضو فعّال
 
لا توجد صورة


تاريخ التسجيل: 26-09-2006
المشاركات: 962

افتراضي

جميل تابع الدروس سوف نتعلم منك

الحمدلله لقيت واحد مهتم

 
27-12-2006, 09:34 PM   مشاركة رقم :: 7
قلم فضي
 
لا توجد صورة


تاريخ التسجيل: 16-09-2006
المشاركات: 3,242

افتراضي

بارك الله فيك
تابع اخي الكريم

 
31-12-2006, 12:06 AM   مشاركة رقم :: 8
عضو فعّال

الصورة الرمزية takiadeen


تاريخ التسجيل: 03-04-2004
المشاركات: 843

افتراضي

شكراً لك اخي على هذا الدرس واعتبرني احد تلاميذك
وان شاء الله التطبيق سوف تراه اليوم

 
31-12-2006, 01:12 AM   مشاركة رقم :: 9
عضو فعّال

الصورة الرمزية takiadeen


تاريخ التسجيل: 03-04-2004
المشاركات: 843

افتراضي

هذا تطبيقي لاول درس ولكن كانت هناك كثير من المشاكل كابدايه
مثلاً ان اللغه case sensitive

ولم ادري كيفيه اخراج التطبيق على شكل ابليكاشن
ولذلك صورت العمل وتركته في الملحقات

اما الاشياء الجميله
فمثلاً يوجد قوائم منسدله لتعطيك المزيد من الخيارات التي يمكنك ان تستخدمها
وايضاً عندما تفتح براكتس او اي شي تجد انه اغلق البراكتس تلقائياً

وهكذا

 
02-01-2007, 10:02 PM   مشاركة رقم :: 10
عضو فعّال
 
لا توجد صورة


تاريخ التسجيل: 15-07-2006
المشاركات: 551

افتراضي

الأخ الهسوس

أشكرك على هذا الشرح المبسط الرائع

استمر و تقبل تحياتي

 
+ إضـافة رد

أدوات الموضوع

الانتقال السريع :::

Powered by vBulletin®
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.