تخطَّ إلى المحتوى

الدوال في Java: Methods والمعاملات و return

الدرس 5 من 11 · Java

الدالة مجموعة أوامر لها اسم، تكتبها مرة وتستدعيها كلما احتجتها. في Java تسمى الدوال Methods (طرق)، لأنها دائماً تعيش داخل كلاس. في هذا الدرس ستكتب دوالك الخاصة، وتتعرف على ميزة تسمح بأكثر من دالة بنفس الاسم، وستكتشف لماذا لا تستطيع الدالة تغيير المتغير الذي أرسلته لها.

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 تُرجع النتيجة وتُنهي الدالة فوراً. لذلك يمكن استخدامها للخروج المبكر:

static String grade(int score) {
if (score >= 90) return "ممتاز";
if (score >= 50) return "ناجح";
return "راسب";
}

grade(95) تُرجع «ممتاز»، و grade(60) تُرجع «ناجح»، و grade(30) تُرجع «راسب». عندما تتحقق أول جملة if، تخرج الدالة ولا تكمل.

تخيّل الدالة مثل ماكينة العصير: تضع فيها البرتقال (المعاملات)، وتخرج لك كوب العصير (القيمة المرجعة). الماكينة من نوع void تشبه غسالة الصحون: تعمل عملاً مفيداً، لكنها لا «تُرجع» لك شيئاً جديداً.

في 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));
الناتج
7
4.0
شاي بـ 2 ملاعق سكر
شاي بـ 0 ملاعق سكر

المترجم يختار النسخة المناسبة حسب ما ترسله. وهذه طريقة Java لتقديم «قيمة افتراضية»: نسخة makeTea() بلا معاملات تستدعي النسخة الأخرى بالقيمة 2.

جرّب هذا:

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);.

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));
الناتج
9
4.0
1024.0
4

max لأكبر قيمة، و sqrt للجذر التربيعي، و pow للأس، و round للتقريب لأقرب عدد صحيح. لاحظ أنها تُستدعى باسم الكلاس: Math.sqrt، تماماً مثل دوالك الـ static.

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.0
150.0

تحدٍّ: أضف نسخة ثانية (Overloading) من priceAfterDiscount بمعامل واحد فقط، تستخدم خصماً افتراضياً 10.

  • نسيان return في دالة لها نوع: خطأ missing return statement.
  • استدعاء دالة غير static من main: خطأ non-static method cannot be referenced from a static context. أضف static حالياً، وستفهم السبب في درس الكلاسات.
  • التوقع أن الدالة تغيّر المتغير الأصلي: Java ترسل نسخة. أرجع القيمة الجديدة واحفظها.

سؤال

ماذا يعني void في static void printReport()؟

سؤال

متى يُسمح بدالتين لهما نفس الاسم في نفس الكلاس؟

  • الدوال في Java تسمى Methods وتعيش داخل كلاس، و static تسمح باستدعائها مباشرة.
  • نوع القيمة المرجعة قبل الاسم، و void لا تُرجع شيئاً، و return تُرجع وتُنهي.
  • Overloading: نفس الاسم بمعاملات مختلفة، ويُستخدم بديلاً للقيم الافتراضية.
  • Java ترسل نسخة من القيم البدائية، فالدالة لا تغيّر المتغير الأصلي.
  • Math فيها دوال جاهزة: max و sqrt و pow و round.