جاري التحميل...

نطاق الأسماء في Java

اكتب دالة اسمها mark بمعامل واحد: static void mark(int n). داخل الأقواس المجعدة اطبع ذلك المعامل بـ System.out.println(n);. من main استدعِ mark(4);. يجب أن تظهر الشاشة سطرًا واحدًا: 4. الاسم n يوجد فقط داخل mark. إذا حاولت طباعة n من main يرفض javac. ذلك الحد — أي الأسماء ترى الدالة — هو ما تعلّمه هذه الصفحة.

أسماء تبقى داخل الدالة

في صفحة التحميل الزائد، شاركت عدة دوال paint اسمًا واحدًا مع قوائم معاملات منفصلة. هنا التركيز أصغر: دالة واحدة، اسم معامل واحد، وأين يُسمح لهذا الاسم بالظهور. المعامل اسم يخص الدالة التي تعلنه. خارج أقواس تلك الدالة المجعدة يختفي الاسم.
أنشئ ملف برنامج صغيرًا باسم Gate.java. يجب أن يطابق public class في السطر الأول اسم الملف: public class Gate. لا تُبقِ اسم فئة قديمًا مثل Sign أو Box في هذا الملف؛ المترجم يتوقع أن يتوافق اسم الفئة مع اسم الملف.
خارج main، وما زلت داخل أقواس الفئة المجعدة، اكتب static void mark(int n). الجسم فيه طباعة واحدة: System.out.println(n);. في هذه الصفحة أبقِ void. أنت تراقب الظهور لا قيم الإرجاع. احفظ الملف قبل الترجمة. البرنامج الكامل الأول في الصندوق التالي.

Gate.java مع mark

هذه النسخة التي تترجمها أولًا. main يحمل الاستدعاء. mark يحمل الطباعة التي تستخدم n.

mark prints its parameter

java
public class Gate {
    public static void main(String[] args) {
        mark(4);
    }

    static void mark(int n) {
        System.out.println(n);
    }
}

من المجلد الذي يحوي Gate.java نفّذ javac Gate.java. عندما تتوافق الأقواس والأقواس المجعدة والفواصل المنقوطة، لا يكتب javac سطرًا من عنده. ثم نفّذ java Gate — لا java Gate.java. احذف لاحقة .java من الأمر الثاني. الأمران نفسهما يعملان على Windows وmacOS. يجب أن يطبع البرنامج سطرًا ويتوقف: 4. لا يطلب منك الكتابة. إذا انتظر الطرفية إدخال لوحة المفاتيح، فما زال استدعاء nextLine من تمرين قديم في الملف. احذفه وأبقِ mark(4); مع دالة mark أعلاه.
سر على التشغيل مرة بالترتيب. تبدأ Java من main. الاستدعاء mark(4) يرسل 4 إلى المعامل n. داخل mark يكتب println(n) الرقم 4. عندما تنتهي mark ينتهي الاسم n أيضًا. main لم يحمل أبدًا اسمًا n. الرقم 4 عبر الاستدعاء كقيمة. الاسم n لم ينتقل إلى main.
إذا أضفت System.out.println(n); داخل main بعد الاستدعاء، يبلغ javac أنه لا يجد الرمز n. ذلك الخطأ هو الدرس: n لم يُعلن في main. أصلحه بحذف ذلك السطر من main، أو أعلن اسمًا آخر في main إن احتجت محليًا هناك. لا تتوقع أن يظهر معامل mark وحده في main.

اسم محلي بجانب المعامل

داخل mark يمكنك أيضًا إعلان اسم جديد ليس معاملًا. ذلك الاسم المحلي يعيش فقط بين أقواس mark المجعدة. غيّر الجسم ليخزّن تسمية ويطبع التسمية وn في سطر واحد، أو أبقِ دالة قصيرة ثانية للعرض — في هذه الصفحة يُظهر الصندوق التالي بدلًا من ذلك تمرير اسم من main، وهو مسار المبتدئ المعتاد.
أمل شائع لدى المبتدئ أن اسمًا أُعلن في main يظهر تلقائيًا داخل كل دوال الفئة. على هذا الشكل ليس كذلك. إذا كان في main السطر int room = 4; وحاولت mark طباعة room دون استقباله، لا يجد javac الاسم room داخل mark. الحل تمرير القيمة: mark(room); مع بقاء الإعلان mark(int n).

مرّر محليًا من main إلى mark

أعلن int room = 4; داخل main. استدعِ mark(room);. داخل mark واصل طباعة n. الشاشة ما زالت تظهر 4. الاسم المحلي في main هو room. اسم المعامل في mark هو n. اسمان مختلفان في مكانين مختلفين. القيمة 4 هي ما يسافر.

pass room into mark

java
public class Gate {
    public static void main(String[] args) {
        int room = 4;
        mark(room);
    }

    static void mark(int n) {
        System.out.println(n);
    }
}

ترجم ونفّذ مرة أخرى: javac Gate.java ثم java Gate. ما زلت ترى سطرًا واحدًا: 4. إذا غيّرت room إلى 9 وتركت جسم الدالة، تظهر الشاشة 9. الدالة ما زالت تطبع ما وصل في n. يستطيع main طباعة room أيضًا إذا أضفت System.out.println(room); في main — ذلك الاسم يخص هناك. main ما زال لا يطبع n.
إذا أعلنت mark محليًا خاصًا بها — مثل int tag = 1; داخل الأقواس — فذلك tag غير مرئي لـ main. محاولة System.out.println(tag); في main تفشل لنفس سبب طباعة n من main. أقواس mark المجعدة جدار لأسماء أُعلنت داخلها.

ماذا يحمي الجدار

اقرأ الفصل بكلمات واضحة. الأسماء المعلنة في main تبقى في main ما لم تمرّر قيمها في استدعاء. الأسماء المعلنة في mark — معاملات ومحليات — تبقى في mark. الاستدعاء يحمل قيمًا لا الأسماء نفسها. التحميل الزائد في الصفحة السابقة مهارة أخرى: عدة دوال باسم دالة مشترك. النطاق يتعلق بأين يُسمح لاسم متغير أو معامل بالظهور في المصدر.
عرض Sign متبقٍ بعدة دوال paint قد يبقى في الملف نفسه ويشوّش الشاشة إذا استدعى main ما زال paint("ok"). نظّف main إلى استدعاء mark الذي تختبره. لا تضع mark داخل أقواس main المجعدة. الدوال داخل الفئة بجانب main.
كتابة System.out.println("n"); في main تطبع الحرف n بين علامتي اقتباس. لا تطبع المعامل. أبقِ println(n) داخل mark عندما تريد القيمة التي وصلت عبر الاستدعاء. كتابة mark(); بأقواس فارغة تفشل عندما يقول الرأس ما زال mark(int n) — يجب أن يرسل الاستدعاء int، سواء لفظًا مثل 4 أو محليًا مثل room.

قبل recursion

يمكنك كتابة mark(int n) وطباعة n داخل تلك الدالة وإبقاء n خارج main. يمكنك إعلان room في main وتمرير room إلى mark. الشاشة تعرض القيمة التي عبرت الاستدعاء. الأسماء لا تتسرب وحدها عبر الأقواس. الصفحة التالية recursion؛ هناك تستدعي الدالة نفسها بوسيط أصغر حتى ينهي شرط التوقف السلسلة.

🧠 اختبر معرفتك

جاهز للبدء

اختبر معرفتك

تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع

❓
6
الأسئلة
🎯
70%
للنجاح
♾️
∞
الوقت
🔄
∞
المحاولات

📝 التعليمات

  • اقرأ كل سؤال بعناية
  • اختر أفضل إجابة لكل سؤال
  • يمكنك إعادة الاختبار عدة مرات كما تريد
  • سيتم عرض تقدمك في الأعلى