التحميل الزائد في Java
ضع في فئة واحدة دالتين تستخدمان الاسم paint. رأس الأولى static void paint(String word). ورأس الثانية static void paint(int n). الجسمان قصيران: الأول يطبع word والثاني يطبع n. من main استدعِ paint("ok"); ثم paint(3);. يجب أن تظهر الشاشة سطرين: ok ثم 3. Java لا تعتبر paint الثانية تعارضًا. ترى الرأسين دالتين مختلفتين لأن قائمتي المعاملات تختلفان. ذلك الاسم المشترك مع قوائم مختلفة هو ما تعلّمه هذه الصفحة.
اسم واحد وقوائم مختلفة
حتى الآن كانت كل فكرة جديدة تستخدم اسم دالة جديدًا: ring وgreet وtwice. هنا يبقى الاسم paint عمدًا. ما يتغيّر هو ما بين الأقواس. قائمة تحمل String. وأخرى تحمل int. يحتفظ المترجم بالاثنتين لأن القائمتين ليستا متطابقتين.
أنشئ ملف برنامج صغيرًا باسم Sign.java. يجب أن يطابق public class في السطر الأول اسم الملف: public class Sign. لا تُبقِ اسم فئة قديمًا مثل Box أو Tip في هذا الملف؛ المترجم يتوقع أن يتوافق اسم الفئة مع اسم الملف.
خارج main، وما زلت داخل أقواس الفئة المجعدة، اكتب رأسي paint معًا. في هذه الصفحة أبقِ void: كل جسم يطبع، ولا حاجة لعودة قيمة إلى main عبر return. الجسم الأول يستخدم System.out.println(word);. والثاني يستخدم System.out.println(n);. احفظ الملف قبل الترجمة. البرنامج الكامل الأول في الصندوق التالي.
Sign.java مع دالتي paint
هذه النسخة التي تترجمها أولًا. main يحمل استدعاءين. الفئة تحمل دالتي paint تشتركان في الاسم.
public class Sign {
public static void main(String[] args) {
paint("ok");
paint(3);
}
static void paint(String word) {
System.out.println(word);
}
static void paint(int n) {
System.out.println(n);
}
}
من المجلد الذي يحوي Sign.java نفّذ javac Sign.java. عندما تتوافق الأقواس والأقواس المجعدة والفواصل المنقوطة، لا يكتب javac سطرًا من عنده. ثم نفّذ java Sign — لا java Sign.java. احذف لاحقة .java من الأمر الثاني. الأمران نفسهما يعملان على Windows وmacOS. يجب أن يطبع البرنامج سطرين ويتوقف: ok ثم 3. لا يطلب منك الكتابة. إذا انتظر الطرفية إدخال لوحة المفاتيح، فما زال استدعاء nextLine من تمرين قديم في الملف. احذفه وأبقِ استدعاءَي paint مع دالتي paint أعلاه.
سر على التشغيل مرة بالترتيب. تبدأ Java من main. الاستدعاء الأول paint("ok"). الوسيط String، فتنفّذ Java الجسم الذي يأخذ String word وتطبع ok. الاستدعاء الثاني paint(3). الوسيط int، فتنفّذ Java الجسم الذي يأخذ int n وتطبع 3. الاسم paint واحد في المرتين. القائمة داخل الأقواس هي التي تختار الجسم.
إذا أظهر السطران ok، فقد تكون أبقيت دالة String فقط وطبعت كلمة ثابتة في كل استدعاء. إذا أظهرا 3، فقد تكون أبقيت دالة int فقط. أبقِ الرأسين. إذا أبلغ javac أن paint معرّفة مسبقًا، تحقق هل للرأسين القائمة نفسها — مثل نسختين من paint(String word). التحميل الزائد يحتاج فرقًا حقيقيًا في القائمة، لا نسخة ثانية من الرأس نفسه باسم معامل مختلف فقط.
قائمة ثانية بكلمتين
عدد المعاملات يمكن أن يختلف أيضًا. أضف تحميلًا زائدًا ثالثًا يأخذ قيمتي String ويطبعهما في سطر واحد مع مسافة. اترك دالتي paint الأوليين في مكانهما. استدعِ الشكل الجديد من main بعد الاستدعاءات السابقة، أو ابدأ main جديدًا يركز على هذا الشكل وأنت تتعلمه.
public class Sign {
public static void main(String[] args) {
paint("hi", "sam");
}
static void paint(String a, String b) {
System.out.println(a + " " + b);
}
}
ترجم ونفّذ مرة أخرى بعد الحفظ: javac Sign.java ثم java Sign. يجب أن تظهر الشاشة سطرًا واحدًا: hi sam. للاستدعاء وسيطان. وللدالة معاملان. هذا التطابق يكفي لتختار Java هذا الجسم. إذا ما زالت لديك paint(String word) وpaint(int n) في الفئة نفسها، يمكنك إبقاؤهما. استدعاء بقيمتي String لا يختار دالة String ذات الوسيط الواحد لأن العدد يختلف.
عندما تضع التحميلات الثلاثة في ملف واحد للتدريب، يستطيع main استدعاء كل شكل في سطره. استدعاء بـString واحد ما زال يذهب إلى paint(String word). واستدعاء بـint واحد ما زال يذهب إلى paint(int n). واستدعاء بقيمتي String يذهب إلى paint(String a, String b). الاسم المشترك لا يمحو تلك الفروق.
قائمة فارغة بجانب قائمة String
دالة بأقواس فارغة قائمة مختلفة أيضًا. يمكنك إبقاء paint() بلا معاملات بجانب paint(String word). الاستدعاء الفارغ paint(); يشغّل جسم القائمة الفارغة. والاستدعاء paint("go"); يشغّل جسم String.
public class Sign {
public static void main(String[] args) {
paint();
paint("go");
}
static void paint() {
System.out.println("ready");
}
static void paint(String word) {
System.out.println(word);
}
}
بعد javac Sign.java وjava Sign يجب أن تظهر الشاشة ready في السطر الأول وgo في الثاني. الاستدعاء الأول لا شيء بين أقواسه، فيطابق paint(). والثاني يرسل String، فيطابق paint(String word). إعادة تسمية إحداهما إلى paintReady ستترجم أيضًا، لكن تلك مهارة أخرى. هذه الصفحة تبقي الاسم paint وتدع القوائم تحمل الفرق.
أي استدعاء يشغّل أي رأس
اقرأ الاستدعاءات بجانب الرؤوس. قائمة الوسائط في الاستدعاء يجب أن تطابق قائمة المعاملات في الرأس. في شكل المبتدئ هذا يهم النوع والعدد معًا.
📊 call beside matching paint
| الاستدعاء في main | الرأس الذي يعمل | سطر الشاشة |
|---|---|---|
paint("ok"); |
paint(String word) |
ok |
paint(3); |
paint(int n) |
3 |
paint("hi", "sam"); |
paint(String a, String b) |
hi sam |
paint(); |
paint() |
ready |
خلط شائع أن تكتب دالتين تقولان كلتاهما paint(String word) وتتوقع أن الثانية تُحسب تحميلًا زائدًا. تغيير اسم المعامل فقط إلى paint(String label) لا يصنع قائمة جديدة للمترجم. هنا يهم النوع والعدد. خلط آخر استدعاء paint(true) دون أن تكتب قائمة معاملات boolean. عندها لا يجد javac paint مطابقة. أضف رأسًا يأخذ النوع الذي تريد، أو غيّر الاستدعاء إلى نوع تدعمه أصلًا.
كتابة System.out.println("paint"); في main تطبع كلمة paint. لا تستدعي أي دالة. أبقِ paint("ok"); عندما تريد التحميل الذي يأخذ String. بقاء twice من ملف Box قديم داخل Sign.java قد يشوّش الشاشة إذا طبع main ما زال twice(7). نظّف main إلى استدعاءات paint التي تختبرها، وأبقِ فقط تحميلات paint اللازمة لذلك التشغيل.
لا تضع دالة paint داخل أقواس main المجعدة. الدوال داخل الفئة بجانب main. التحميلان الزائدان دالتان شقيقتان في جسم الفئة نفسه.
قبل scope
يمكنك إبقاء اسم دالة واحد وعدة قوائم معاملات في الفئة نفسها. تختار Java الجسم من قائمة وسائط الاستدعاء. الشاشة تعرض سطر الجسم المطابق. رأسان بالقائمة نفسها ليسا تحميلًا زائدًا. الصفحة التالية scope؛ هناك ترى أي الأسماء ظاهرة داخل الدالة وأيها تبقى خارجها.
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى