الدوال المعرّفة من قبل المستخدم
كتلة من الأوامر لها اسم ووظيفة، نكتبها مرة واحدة ونستدعيها كلما احتجنا إليها.
- تعرّف الدالة، وتحدد أجزاء رأسها: محدد الوصول، ونوع القيمة المرجعة، والاسم، والمعاملات.
- تستدعي دالة من main، وتتتبّع انتقال التنفيذ إليها ثم عودته.
- تميّز بين المعاملات parameters والوسيطات arguments في مثال معطى.
- تكتب دالة تعيد قيمة باستخدام return، وتستقبل ناتجها في متغير.
- تطبّق التحميل الزائد Overloading، وتكتب دالة تستدعي نفسها Recursion بشرط توقّف.
١ما هي الدالة؟
أجزاء رأس الدالة (توقيعها signature)
access static return_type method_name(parameters){ statement1; statement2;}
| الجزء | معناه |
|---|---|
public / private / protected | محدد الوصول: من يستطيع استدعاء الدالة. إن لم يُكتب يكون default. |
static | تُستدعى مباشرة دون إنشاء كائن (نحتاجها الآن لأننا نستدعي من main الثابتة). |
void / int / String … | نوع القيمة التي تعيدها الدالة، و void تعني «لا تعيد شيئًا». |
| الاسم | يتبع قواعد تسمية المتغيرات. |
| المعاملات | متغيرات تستقبل البيانات المرسلة عند الاستدعاء، وتُعامل كمتغيرات محلية. |
٢لماذا نكتب دوالًّا؟
٣إنشاء الدالة واستدعاؤها
لاستدعاء دالة نكتب اسمها ثم قوسين ثم فاصلة منقوطة. ينتقل التنفيذ إلى جسمها، ثم يعود إلى السطر التالي.
package methods;public class Methods { public static void main(String[] args) { write_msg(); System.out.println("Hi. I am the main () function"); write_msg(); write_msg(); } static void write_msg(){ System.out.println("Hello. This is the write_msg() function"); }}
ويمكن استدعاء الدالة نفسها عدة مرات: write_msg(); write_msg(); write_msg();
٤المعاملات parameters والوسيطات arguments
package methods;public class Methods { public static void main(String[] args) { sum(2, 4, 9); sum(8, 3); } static void sum(int a, int b){ System.out.println(a + b); } static void sum(int a, int b, int c){ int s = a + b + c; System.out.println(s); }}
| المعامل parameter | الوسيطة argument | |
|---|---|---|
| أين؟ | في رأس الدالة عند تعريفها | في جملة الاستدعاء |
| ما هو؟ | متغير يستقبل القيمة | القيمة الحقيقية المرسلة |
| في المثال | a , b في الدالة sum | 8 , 3 عند الاستدعاء في السطر 5 |
شروط الاستدعاء الصحيح
- عدد الوسيطات يساوي عدد معاملات الدالة.
- تتوافق (تتطابق) أنواع البيانات بين الوسيطات والمعاملات.
٥دالة تعيد قيمة
نضع نوع القيمة بدل void، ونعيد النتيجة بالكلمة return.
package methods;public class Methods { public static void main(String[] args) { sum(8, 3); System.out.println( sum(2, 4, 9) ); int z = sum(4, 9, 8); System.out.println(z); } static void sum(int a, int b){ System.out.println(a + b); } static int sum(int a, int b, int c){ int s = a + b + c; return s; }}
- إذا كانت الدالة تعيد قيمة فاستقبلها في متغير من النوع نفسه (السطر 6)، أو أرسلها إلى دالة الطباعة (السطر 5).
- إذا كانت لا تعيد قيمة (void) فلا يمكنك استقبال قيمة منها.
٦التحميل الزائد Overloading
عدّة دوال بالاسم نفسه في الكلاس نفسه، تختلف في عدد المعاملات أو أنواعها أو ترتيبها. يختار المترجِم النسخة المناسبة حسب الوسيطات.
مثاله في الدرس: دالتا sum في القسم ٤ (معاملان وثلاثة)، والتدريب العملي 3 أدناه (int و double).
٧الاستدعاء الذاتي Recursion
الدالة تستدعي نفسها من داخلها، فتغني عن جملة التكرار. أهم شيء فيها شرط التوقّف؛ بدونه تستدعي نفسها إلى ما لا نهاية حتى يمتلئ المكدّس.
public class Main{ static void myprint(int i) { if (i <= 5) { System.out.println(i); i++; myprint(i); } } public static void main(String[] args) { myprint(1); System.out.println("انتهى البرنامج"); }}
توقّع وتحقّق
أجب قبل أن تنظر إلى الشرح. التصحيح فوري، وإجاباتك تُحفظ.
اختر الإجابة الصحيحة:
لدينا تعريف الدالة
static void myFunction() { }
الاستدعاء الصحيح لها من داخل دالة main هو:
دالة تستقبل ثلاثة أعداد وتعيد أكبرها، ما نوع القيمة المرجعة لها؟
تأمل الكود التالي،
ماذا سيكون الناتج عند تنفيذه؟
static void p(String name, int x) { for (int i = 1; i <= x; i++) System.out.println(i + ". " + name);} public static void main(String[] args) { p("Ali", 2);}
أي زوج من الدوال التالية يمثّل تحميلًا زائدًا Overloading صحيحًا؟
الخلاصة
- الدالة كتلة أوامر لها اسم، تُعرَّف داخل كلاس وتُستدعى باسمها.
- المعامل في التعريف، والوسيطة في الاستدعاء؛ ويجب تطابق العدد والنوع.
- void لا تعيد شيئًا، وغيرها يعيد قيمة بـ return.
- Overloading: الاسم نفسه بمعاملات مختلفة، ولا يكفي اختلاف النوع الراجع.
- Recursion: الدالة تستدعي نفسها، ولا بد من شرط توقّف.