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

الكائنات في Java

اكتب صنفًا اسمه Chip في Chip.java بدالة beep تطبع ok. الدالة ليست static في هذه الصفحة. في ملف ثانٍ Bench.java ابنِ chip بـ Chip c = new Chip();، ثم استدعِ c.beep();. ترجم الملفين ونفّذ java Bench. يجب أن تظهر الشاشة سطرًا واحدًا: ok. كلمة new تبني كائنًا من الصنف. المتغير c يحمل ذلك الكائن. تستدعي beep على c، لا على اسم الصنف العاري. ذلك الكائن المبني — والاستدعاء الذي يستخدمه — هو ما تعلّمه هذه الصفحة.

كائن واحد من الصنف

الصنف ما زال النوع المسمّى. الكائن قيمة مبنية من ذلك النوع. السطر new Chip() يطلب من Java بناء تلك القيمة. تخزّنها في متغير نوعه Chip، ثم تستخدم المتغير للوصول إلى الدوال التي تخص كل كائن.
أنشئ Chip.java أولًا. سطر public class هو public class Chip. لا تُبقِ اسم صنف قديمًا Badge أو Desk في هذا الملف. داخل الأقواس المجعدة اكتب void beep() — بلا كلمة static في هذا الرأس. الجسم طباعة واحدة: System.out.println("ok");. أبقِ void. الدالة لا ترجع رقمًا. لا يوجد main في Chip.java في هذه الصفحة. احفظ الملف قبل الترجمة.

Chip with beep

java
public class Chip {
    void beep() {
        System.out.println("ok");
    }
}

Bench يبني الـ chip ثم يستدعي beep

أنشئ Bench.java في المجلد نفسه. سطر public class هو public class Bench. داخل main اكتب سطرين: أولًا Chip c = new Chip();، ثم c.beep();. الأول يعلن متغيرًا c من نوع Chip ويملأه بكائن جديد. الثاني يستدعي beep على ذلك الكائن. النقطة تأتي بعد اسم المتغير، لا بعد اسم الصنف وحده.

Bench builds one chip

java
public class Bench {
    public static void main(String[] args) {
        Chip c = new Chip();
        c.beep();
    }
}

من المجلد الذي يحوي الملفين نفّذ javac Chip.java Bench.java. يمكنك ترجمة Chip.java أولًا ثم Bench.java عندما يكتمل الملفان. عندما تتوافق الأقواس والأقواس المجعدة والفواصل المنقوطة، لا يكتب javac سطرًا من عنده. ثم نفّذ java Bench — لا java Bench.java، ولا java Chip. احذف لاحقة .java من أمر التشغيل. ابدأ الصنف الذي يحمل main. الأوامر نفسها تعمل على Windows وmacOS.
يجب أن يطبع البرنامج سطرًا ويتوقف: ok. لا يطلب منك الكتابة. إذا انتظر الطرفية لوحة المفاتيح، فما زال استدعاء nextLine من تمرين قديم في ملف. احذفه وأبقِ Chip c = new Chip(); مع c.beep(); في Bench، وbeep في Chip.
سر على التشغيل مرة. تبدأ Java من Bench.main. التعبير new Chip() يبني كائنًا. يُخزَّن ذلك الكائن في c. الاستدعاء c.beep() يدخل beep لذلك الكائن. الدالة تطبع ok وتعود. ثم ينتهي Bench. سطر الشاشة جاء من دالة الكائن بعد أن أنشأ new الكائن.
فكّر في الصنف كالمخطط على القرص والكائن كقطعة مبنية في الذاكرة لهذا التشغيل. تترجم المخطط مرة. كل new Chip() يبني قطعة أخرى. المتغير يسمّي القطعة حتى تصل إليها الأسطر اللاحقة. بلا ذلك الاسم لا تبقى قبضة لـ beep في هذه الصفحة.

لماذا الاستدعاء يستخدم c لا Chip وحده

في صفحة الأصناف كان يمكن استدعاء دالة static كـ Badge.show() باسم النوع. هنا beep بلا كلمة static. Java تتوقع كائنًا أولًا. كتابة Chip.beep(); بلا كائن لا توافق هذا الشكل للمبتدئين. ابنِ بـ new، احتفظ بالنتيجة في متغير، ثم استدعِ عبر ذلك المتغير.
إذا كتبت فقط new Chip(); ولم تخزّن أبدًا، فقد بنيت كائنًا لكن لا اسم لديك لاستدعاء beep. في هذه الصفحة أبقِ المتغير: Chip c = new Chip(); ثم c.beep();. المتغير هو الطريق إلى الكائن بعد انتهاء new.
عرض static متبقٍ قد يشوّش المجلد. ملف ما زال يستدعي Badge.show(); هو شكل الدرس السابق. لهذه الصفحة أبقِ Chip وBench وسطر new. لا تحتاج Badge هنا.

كائنان، وbeep مرتان

يمكنك بناء أكثر من كائن من الصنف نفسه. كل new Chip() يصنع كائنًا منفصلًا. كل كائن يمكنه تشغيل beep لنفسه. نص الصنف مشترك؛ الكائنات ليست القيمة نفسها.

Bench builds two chips

java
public class Bench {
    public static void main(String[] args) {
        Chip a = new Chip();
        Chip b = new Chip();
        a.beep();
        b.beep();
    }
}

ترجم وشغّل من جديد: javac Chip.java Bench.java، ثم java Bench. يجب أن تظهر الشاشة سطرين: ok، ثم ok. الأول جاء من a. الثاني من b. كلاهما استخدم نص دالة beep نفسه في Chip، لكن كل استدعاء جرى على كائن مختلف بُني بـ new.
إذا أظهرت الشاشة ok واحدًا فقط، تحقق من وجود الاستدعاءين ومن بناء كلا المتغيرين بـ new. كتابة Chip b = a; لا تبني كائنًا ثانيًا؛ تجعل b يشير إلى نفس كائن a. تلك الفكرة تنتظر صفحات لاحقة. في هذه الصفحة استخدم تعبيري new Chip() عندما تريد كائنين.

ما تتركه هذه الصفحة لـ fields

هذه الصفحة لا تخزّن رقمًا أو كلمة داخل الـ chip بعد. الحقول — أسماء تحمل بيانات على كل كائن — هي الصفحة التالية. هنا يوجد الكائن بعد new، ودالة النسخة beep تطبع فقط. ذلك يكفي لرؤية الفصل بين الصنف كنوع وكائن كقيمة مبنية.
يمكنك إعادة تسمية المتغير من c إلى unit: Chip unit = new Chip(); ثم unit.beep();. تبقى الشاشة ok عندما يطبع جسم الدالة تلك الكلمة بعد. اسم المتغير لك؛ اسم النوع Chip وتعبير new Chip() يجب أن يظلا متوافقين.
إذا قال javac إنه لا يجد الرمز Chip أثناء ترجمة Bench.java، تحقق من أن Chip.java في المجلد نفسه وأن سطر الصنف يقول فعلًا public class Chip. إذا لم يطبع التشغيل شيئًا، أكّد أن main ما زال يستدعي c.beep(); بعد سطر new وأن beep ما زال يحوي println.

قبل fields

يمكنك كتابة Chip بـ void beep()، وبناء كائن بـ Chip c = new Chip();، واستدعاء c.beep(); من Bench. ترجم الملفين ونفّذ java Bench. تظهر الشاشة ok. new Chip() ثانٍ يبني كائنًا آخر يمكنه الـ beep وحده. الصفحة التالية fields؛ هناك يبدأ كل كائن بحمل بياناته المخزّنة.

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

جاهز للبدء

اختبر معرفتك

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

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

📝 التعليمات

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