الدوال في Java: Methods والمعاملات و return
الدالة مجموعة أوامر لها اسم، تكتبها مرة وتستدعيها كلما احتجتها. في Java تسمى الدوال Methods (طرق)، لأنها دائماً تعيش داخل كلاس. في هذا الدرس ستكتب دوالك الخاصة، وتتعرف على ميزة تسمح بأكثر من دالة بنفس الاسم، وستكتشف لماذا لا تستطيع الدالة تغيير المتغير الذي أرسلته لها.
تعريف دالة
Section titled “تعريف دالة”public class Main { static void greet() { System.out.println("أهلاً بك في Java!"); }
static int add(int a, int b) { return a + b; }
public static void main(String[] args) { greet(); System.out.println(add(3, 4)); }}أهلاً بك في Java!7لنفكك السطر static int add(int a, int b):
static: الدالة تابعة للكلاس نفسه، ونستدعيها مباشرة منmainدون إنشاء كائن. ستفهمها أعمق في درس الكلاسات.int: نوع القيمة المرجعة. هذه الدالة تُرجع عدداً صحيحاً.add: اسم الدالة، ويُكتب بصيغة camelCase ويبدأ غالباً بفعل.(int a, int b): المعاملات، ولكل معامل نوعه.
و void تعني أن الدالة لا تُرجع شيئاً، بل تؤدي عملاً فقط، مثل greet التي تطبع.
والدالة main نفسها التي تكتبها في كل برنامج؟ هي دالة عادية، لكنها نقطة البداية التي تشغّلها Java أولاً.
return
Section titled “return”return تُرجع النتيجة وتُنهي الدالة فوراً. لذلك يمكن استخدامها للخروج المبكر:
static String grade(int score) { if (score >= 90) return "ممتاز"; if (score >= 50) return "ناجح"; return "راسب";}grade(95) تُرجع «ممتاز»، و grade(60) تُرجع «ناجح»، و grade(30) تُرجع «راسب». عندما تتحقق أول جملة if، تخرج الدالة ولا تكمل.
تخيّل الدالة مثل ماكينة العصير: تضع فيها البرتقال (المعاملات)، وتخرج لك كوب العصير (القيمة المرجعة). الماكينة من نوع void تشبه غسالة الصحون: تعمل عملاً مفيداً، لكنها لا «تُرجع» لك شيئاً جديداً.
التحميل الزائد (Overloading)
Section titled “التحميل الزائد (Overloading)”في Java يمكن أن يكون لأكثر من دالة نفس الاسم، بشرط أن تختلف في عدد المعاملات أو أنواعها:
static int add(int a, int b) { return a + b;}
static double add(double a, double b) { return a + b;}
static String makeTea(int sugar) { return "شاي بـ " + sugar + " ملاعق سكر";}
static String makeTea() { return makeTea(2);}System.out.println(add(3, 4));System.out.println(add(2.5, 1.5));System.out.println(makeTea());System.out.println(makeTea(0));74.0شاي بـ 2 ملاعق سكرشاي بـ 0 ملاعق سكرالمترجم يختار النسخة المناسبة حسب ما ترسله. وهذه طريقة Java لتقديم «قيمة افتراضية»: نسخة makeTea() بلا معاملات تستدعي النسخة الأخرى بالقيمة 2.
تمرير القيم
Section titled “تمرير القيم”جرّب هذا:
static void tryToChange(int x) { x = 100;}
public static void main(String[] args) { int value = 5; tryToChange(value); System.out.println(value);}5لماذا لم تتغير القيمة إلى 100؟ لأن Java ترسل للدالة نسخة من القيمة، لا المتغير الأصلي. الدالة غيّرت النسخة فقط. مثل أن تعطي صديقك صورة من واجبك: إذا كتب عليها، يبقى واجبك الأصلي نظيفاً.
إذا أردت أن تؤثر الدالة في النتيجة، اجعلها تُرجع القيمة الجديدة، واحفظها: value = calculate(value);.
دوال Math الجاهزة
Section titled “دوال Math الجاهزة”Java تأتي مع دوال رياضية جاهزة في الكلاس Math:
System.out.println(Math.max(4, 9));System.out.println(Math.sqrt(16));System.out.println(Math.pow(2, 10));System.out.println(Math.round(3.6));94.01024.04max لأكبر قيمة، و sqrt للجذر التربيعي، و pow للأس، و round للتقريب لأقرب عدد صحيح. لاحظ أنها تُستدعى باسم الكلاس: Math.sqrt، تماماً مثل دوالك الـ static.
جرّب بنفسك
Section titled “جرّب بنفسك”public class Main { static double priceAfterDiscount(double price, double percent) { return price - price * percent / 100; }
public static void main(String[] args) { System.out.println(priceAfterDiscount(200, 10)); System.out.println(priceAfterDiscount(200, 25)); }}180.0150.0تحدٍّ: أضف نسخة ثانية (Overloading) من priceAfterDiscount بمعامل واحد فقط، تستخدم خصماً افتراضياً 10.
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان return في دالة لها نوع: خطأ
missing return statement. - استدعاء دالة غير static من main: خطأ
non-static method cannot be referenced from a static context. أضفstaticحالياً، وستفهم السبب في درس الكلاسات. - التوقع أن الدالة تغيّر المتغير الأصلي: Java ترسل نسخة. أرجع القيمة الجديدة واحفظها.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ماذا يعني void في static void printReport()؟
void تعني أن الدالة تؤدي عملاً دون أن تُرجع قيمة لمن استدعاها.
سؤال
متى يُسمح بدالتين لهما نفس الاسم في نفس الكلاس؟
هذا هو التحميل الزائد (Overloading): المترجم يميّز بينهما بالمعاملات، لا بنوع القيمة المرجعة.
الخلاصة
Section titled “الخلاصة”- الدوال في Java تسمى Methods وتعيش داخل كلاس، و
staticتسمح باستدعائها مباشرة. - نوع القيمة المرجعة قبل الاسم، و
voidلا تُرجع شيئاً، وreturnتُرجع وتُنهي. - Overloading: نفس الاسم بمعاملات مختلفة، ويُستخدم بديلاً للقيم الافتراضية.
- Java ترسل نسخة من القيم البدائية، فالدالة لا تغيّر المتغير الأصلي.
Mathفيها دوال جاهزة:maxوsqrtوpowوround.