الدوال : تسمي التوابع او الطرق او المناهج وهي عبارة عن مجموعة من التعليمات المجمعة تحت أسم واحد
خصائص الدوال
يمكن إستدعائها في اي نقطة في البرنامج فقط بكتابة إسمها
بعد تنفيذها يتم الرجوع الي نقطة الاستدعاء في الدالة الرئيسية
تساعد الدوال في تنظيم وتنسيق البرنامج
تقسيم البرنامج الي مجموعة برامج فرعية بحيث يكون لكل منها وظيفة محددة
تساعد في إختصار الكود وعدم تكراريته
تساعد في عملية متابعة الكود وتتبعه لتسهيل تصحيح الكود وتحديثه
أنواع الدوال في لغة الجافا Type Of Method In Java
تنقسم الدوال في الجافا الي نوعان رئيسيان وهما :
الدوال الجاهزة Build-In :
وهي مجموعة الدوال المبرمجة مسبقا ضمن حزمة المترجم الخاص بلغة الجافا(الدوال الرياضية , دوال تتعامل مع النصوص , دوال عامة)دوال مكتوبة بواسطة المبرمج User-Definde :
هي مجموعة الدوال المعرفة من قبل المبرمج لتنفيذ وظيفة معينة وهي تتكون من جزئين رئيسيان :Method-Header() // رأس الدالة { Method-Body // جسم الدالة }
معاير تصنيف الدوال المعرفة من قبل المبرمج :
قابلية الوصول Access Modifier :
عامة Public : يمكن الوصول اليها من اي مكان في المشروع
خاصة Private : لا يمكن الوصول اليها الا من نفس الفئة المعرفة فيها (من نفس class)
محمية Proteced : لا يمكن الوصول اليها الا من خلال الفئة نفسها او الفئات الوارثة من الفئة
المشاركة بين الكائنات ( Static and Non-Static ):-
بما أن الدوال يتم تعريفها داخل الفئات class إذا يمكن ان نشتق منها مجموعة كائنات opjects وفي هذه الحالة يوجد نوعان من الدوال :
تصنيف الدوال من حيث القيمة الراجعة Returned value to calling code :-
دوال ترجع قيمة return vlaue :-
تسمي (Getter) هذا النوع من الدوال يقوم بتنفيذ تعليمات محددة ثم تقوم بارجاع القيمة حسب نوع بيانات الدالة الي سطر الاستدعاء بعد إنتهاء التنفيذ ويجب ان تحتوي الدالة علي الكلمة المحجوزة returnدوال لا ترجع قيمة return no value :-
سطر الاستدعاء calling code:-
هو السطر الذي تم عنده إستدعاء الدالة في الدالة الرئيسية Main Method
int sum(4,5) { int z=4+5; return z; } //عند إستدعاء هذه الدالة فأنها ترجع قيمة الجمع
تسمي (setter) وهي دوال من النوع الخالي void هذا النوع يقوم بتنفيذ تعليمات محددة دون إرجاع قيمة الي سطر الاستدعاء بعد إنتهاء التنفيذ
public class Test {
public static void printName(){
System.out.println("gagacadmey.blogspot.com");
}
public static void main(String[] args) {
// تم إستدعاء الدالة ولاحظ أ أنه لم تمرر اليها اي قيمة
printName();
}
}
تصنيف الدوال من حيث المعاملات With or Without Parameters :-
دوال تحتاج الي معاملات Have Parameter :
وهي دوال تحتاج الي تمرير معاملات اليها عند إستدعائهادوال لا تحتاج الي معاملات Have No Parameter :
هي دوال لا تحتاج الي تمرير قيم عن الاستدعاء حيث لا تكتب اي قيم بين قوسين الدالة
return_type fun_name(param1 , param2) { fun_body }//عند الاستدعاء فان القيمة الراجعة ستكون نتيجة تنفيذ ما بداخل الدالة
حيث أن :
return_type : نوع القيمة الراجعة (int , float , double , char , string)fun_name : أسم الدالة
parameters : هي المعاملات
fun_body : هو محتوي الدالة
void printmessage() { System.out.print("I Am Function Without Any Parameter"); } //عند الاستدعاء تطبع هذه الدالة ما بداخل جملة الطباعة فقط
عند إستدعاء الدوال يجب كتابة أسمها وإرفاق المعاملات بين الاقواس , واذا كانت لا تحتوي علي معاملات تكتب الاقواس فارغة
printmessage();
طرق تمرير المعاملات الي الدالة
المعاملات هي قيم متغيرات او ثوابت يتم تمريرها الي الدالة أثناء الاستدعاء
تسمي المعاملات الموجودة في الدالة الرئيسية (المكتوبة امام جملة الاستدعاء) بالمعاملات الفعلية
تسمي المعاملات المناظرة لها (المكتوبة في رأس الدالة ) في الدالة التي تم إستدعائها بالمعاملات الشكلية او المنسوخة او الصورية
تمرير المعاملات بالقيمة Pass By Value :-
في هذه الطريقة يتم إرسال صورة من المعامل الفعلي الي المعامل الصوري او المنسوخ
المعاملين الفعلي والصوري لا يشتركان في نفس موقع الذاكرة
المعامل الفعلي لا يتأثر بالتغيرات في المعامل الصوري
هذا النوع من التمرير يتم تطبيقه تلقائيا عندما يكون نوع المعاملات الفعلية من انواع البيانات البدائية (int double float)
تمرير المعاملات بالمرجع Pass By Reference :-
فيه يتم إرسال عنوان المعامل الفعلي في الذاكرة الي المعامل الصوري المناظر له في الدالة المستدعيه
المعاملين الفعلي والصوري يشيران الي نفس عنوان الذاكرة
كل تغير في المعامل الصوري سيتم تطبيقه في المعامل الفعلي
هذا النوع يتم تطبيقه عندما تكون المعاملات الفعلية من نوع كائن Opject مثل المصفوفات
مثال
package arrays; public class Test { public static void main(String[] args) { // هنا قمنا بتعريف مصفوفة int[] numbers = { 10, 20, 30, 40, 50 }; // هنا قمنا باستدعاء الدالة و مررنا لها المصفوفة printArray(numbers); System.out.println(); // هنا قمنا باستدعاء الدالة و أنشأنا مصفوفة بداخله printArray(new int[] {23, 43, 54, 34, 90}); } // argument هنا قمنا بتعريف دالة تطبع محتوى أي مصفوفة نمررها لها كـ public static void printArray(int[] array) { for (int i=0; i<array.length; i++) { System.out.print(array[i] + " "); } } }
23 43 54 34 90
Access_Modifier return_type[] fun_name (Array_type Array_name[]) {}
مثال
public class arrayExample { static int MaxNum_Arr(int Arr[]){ // تم تعريف دالة تستقبل مصفوفة بيانات من النوع الصحيح int max = Arr[0]; for (int i=0; i < 3; i++) {// هنا يتم المرور علي كل رقم ومقارنته مع القيمة السابقة if(Arr[i] > max); max = Arr[i];// الان يتم تبديل الرقم اذا كانت نتيجة المقارنة صحيحة } return max;// اخيرا يقوم بارجاع القيمة المخزنة وهي قيمة اكبر رقم } public static void main(String[] args) { int arry1[] = {10,20,30}; // هنا يتم إنشاء المصفوفة int arry2[] = {15,25,35}; // هنا يتم إنشاء المصفوفة ثانية بقيم جديدة // الان يتم إستدعاء الدالة وتمرير المصفوفات اليها System.out.println("the max number in array1 : " + MaxNum_Arr(arry1)); System.out.println("the max number in array2 : " + MaxNum_Arr(arry2)); } }
the max number in array2 : 35
التحميل الزائد للدوال Method Overloading
التحميل الزائد هو كتابة اكثر من دالة وتحمل نفس الاسم في نفس الفئة ولكن تختلف في المعاملات
لتعريف اكثر من دالة بنفس الاسم لابد من أن تختلف في ثلاث أشياء :
عدد المعاملات Number Of Parameters
نوع المعاملات Data Type Of Parameters
ترتيب نوع المعاملات Sequence Of Data Type Of Parameters
دالتين مختلفتين في عدد المعاملات
public static int max(int x , int y) { // method body } |
public static int max(int x , int y , int z) { // method body } |
دالتين مختلفتين في ترتيب نوع المعاملات
public static int max(int x , double y) { // method body } |
public static int max(double x , int y) { // method body } |
دالتين مختلفتين في نوع المعاملات
public static int max(double x , double y) { // method body } |
public static int max(int x , int y) { // method body } |
ليست هناك تعليقات:
إرسال تعليق
ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.