Menu
flag Ar iconالعربيةdown icon

معاملات الدوال في جافا: الوسائط والتمرير بالقيمة والإرجاع

كيف تعمل معاملات الدوال في جافا - تمرير الوسائط، والفرق بين المعاملات والوسائط، وقاعدة التمرير بالقيمة في جافا، وإرجاع القيم.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

المعاملات تتيح للدالة أن تستقبل مُدخلات

الدالة التي تفعل الشيء نفسه دائمًا محدودة. المعاملات هي المُدخلات التي تعلن عنها داخل قوسي الدالة كي تتمكن الدالة نفسها من العمل على قيم مختلفة في كل مرة تستدعيها فيها.

تذكر كل معامل مع نوعه واسمه. داخل جسم الدالة، يتصرف المعامل كأنه متغير محلي عادي يحمل بالفعل ما مرره المُستدعي.

name هو المعامل. أما "Sam" و"Alex" فهما الوسيطتان - القيمتان المحددتان المقدمتان عند الاستدعاء. تعريف واحد للدالة، ومخرجان مختلفان.

المعاملات مقابل الوسائط

تُستخدم هاتان الكلمتان بشكل فضفاض، لكن من المفيد إبقاء الفرق واضحًا:

  • المعامل هو العنصر النائب في التعريف: String name.
  • الوسيطة هي القيمة التي تمررها فعليًا: "Sam".

إذن void greet(String name) يعلن عن معامل، وgreet("Sam") يمرر وسيطة. عندما يقول أحدهم «هذه الدالة تأخذ معاملين»، فهو يقصد التعريف؛ وعندما يقول «مررت وسيطتين»، فهو يقصد الاستدعاء.

تعدد المعاملات

افصل بين المعاملات بفواصل، وأعطِ كلًا منها نوعه الخاص - لا يمكنك مشاركة نوع واحد بين معاملين كما قد تفعل في تعريف متغير:

تُربط الوسائط بالمعاملات حسب الموضع بدقة، وليس حسب الاسم. يعمل describe("Sam", 30, true) لأن الترتيب يتطابق مع (String name, int age, boolean active). إذا بدّلت بين وسيطتين من أنواع متوافقة، تحصل على خطأ منطقي صامت وليس خطأ في الترجمة (compile) - لذا فإن الترتيب مهم.

من الأخطاء الشائعة كتابة int add(int a, b). كل معامل يحتاج إلى نوعه الخاص: int add(int a, int b).

إرجاع قيمة

المعاملات هي الطريقة التي تتدفق بها البيانات إلى الداخل؛ والقيمة المُرجَعة هي الطريقة التي تتدفق بها النتيجة إلى الخارج. أعلن عن نوع الإرجاع قبل اسم الدالة، واستخدم return لإعادة قيمة إلى المُستدعي:

يجب أن يتطابق نوع الإرجاع (double) مع ما تُرجِعه فعليًا عبر return. الدالة المُعلَنة بـ void لا تُرجِع شيئًا - ومع ذلك يمكنها استخدام return; المجرد للخروج مبكرًا، لكنها لا تستطيع إرجاع قيمة. في اللحظة التي يُنفَّذ فيها return، تنتهي الدالة ويعود التحكم إلى موضع الاستدعاء.

جافا تمرر بالقيمة

هذا يربك الجميع تقريبًا في البداية. عندما تمرر وسيطة، تنسخ جافا القيمة إلى المعامل. بالنسبة للأنواع البدائية، يعني ذلك أن الدالة تحصل على نسختها الخاصة - وتغيير المعامل لا يمس أبدًا متغير المُستدعي:

تبقى x تساوي 5. عدّلت الدالة نسختها الخاصة من الرقم، لا الأصل.

تمرير الكائنات: لا يزال بالقيمة، لكن انتبه للمرجع

تبدو الكائنات استثناءً، لكنها ليست كذلك. ما يُنسَخ هو المرجع (السهم الذي يشير إلى الكائن)، وليس الكائن نفسه. لذا تشير الدالة إلى الكائن نفسه ويمكنها تعديله:

نتيجتان مختلفتان، وقاعدة واحدة. تتبع addItem المرجع وتغير القائمة الفعلية، لذا يرى المُستدعي ظهور new. أما replace فتعيد إسناد المعامل إلى قائمة جديدة تمامًا - لكن ذلك يعيد توجيه النسخة المحلية من المرجع فقط، لذا تبقى قائمة list لدى المُستدعي دون تغيير. الخلاصة: يمكنك تغيير كائن عبر معامل، لكنك لا تستطيع أبدًا جعل متغير المُستدعي يشير إلى مكان جديد.

التالي: تحميل الدوال الزائد (Overloading)

أصبحت الآن تعرف كيف تزود الدالة بالمدخلات التي تحتاجها بالضبط. لكن ماذا لو أردت أن يقبل اسم دالة واحد مجموعات مختلفة من المعاملات - مثل print(int) وprint(String)؟ هذا هو تحميل الدوال الزائد، وهو موضوع الصفحة التالية.

الأسئلة الشائعة

ما الفرق بين المعامل والوسيطة في جافا؟

المعامل هو المتغير المُسمَّى في تعريف الدالة - String name في void greet(String name). أما الوسيطة فهي القيمة الفعلية التي تمررها عند استدعاء الدالة - فاستدعاء greet("Sam") يمرر الوسيطة "Sam". باختصار: المعاملات تعيش في التعريف، والوسائط تعيش في الاستدعاء.

هل جافا تمرر بالقيمة أم بالمرجع؟

جافا تمرر دائمًا بالقيمة. بالنسبة للأنواع البدائية تُمرَّر نسخة من القيمة، لذا فإن إعادة إسناد المعامل لا يمكن أن تغير متغير المُستدعي. أما بالنسبة للكائنات فتُمرَّر نسخة من المرجع - يمكنك تعديل الكائن الذي يشير إليه المرجع (مثل الإضافة إلى قائمة)، لكن إعادة إسناد المعامل نفسه لا تؤثر على متغير المُستدعي.

كيف تمرر عدة وسائط إلى دالة في جافا؟

اذكر المعاملات في التعريف مفصولة بفواصل، ولكل منها نوعه الخاص: int add(int a, int b). ثم استدعِها مع الوسائط بالترتيب نفسه: add(2, 3). تربط جافا الوسائط بالمعاملات حسب الموضع بدقة وليس حسب الاسم، لذا يجب أن يتطابق الترتيب.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن