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

الواجهات في Java

أعلن interface برؤوس متدات فارغة، ثم املأ تلك المتدات في فئة بـ implements. اكتب interface Signal مع void horn(); بلا بدنة. اكتب class Truck implements Signal وأعطِ horn بدنة تطبع honk. في Yard.java ابنِ Truck واستدعِ t.horn(). ترجم بـ javac Yard.java وشغّل java Yard. يجب أن تُظهر الشاشة honk. عرض ثانٍ يتيح لفئة واحدة أن implements واجهتين معًا. اترك enum للصفحة التالية — هذا الدرس وعد بمتد والفئة التي تفي به.

نفّذ متد واجهة واحد

صفحة إعادة التعريف أعادت كتابة horn على ابن كان أصلًا extends Car. هذه الصفحة تبدأ من وعد بلا بدنة. افتح Yard.java. أبقِ اسم الفئة العامة Yard. احذف عروض Car/Truck المتبقية بـ extends إن دفنت قصة الواجهة، وطباعات المنشئ بـ super، وعروض المسار، وأي Scanner للوحة المفاتيح. لا ينتظر البرنامج الكتابة. لا تحتاج سطر import.
أعلن الواجهة فوق الفئات:
interface Signal {
void horn();
}
ينتهي الرأس بفاصلة منقوطة. لا توجد بدنة { } لـ horn داخل الواجهة في هذا الشكل للمبتدئين.
أعلن الفئة التي تفي بالوعد:
class Truck implements Signal {
داخل Truck اكتب متدًا public بنفس الاسم واملأ البدنة:
public void horn() {
System.out.println("honk");
}
الكلمة المفتاحية implements، لا extends. يجب أن توفّر الفئة بدنة لكل متد مدرج على الواجهة. في هذه الصفحة ذلك فقط horn.
داخل Yard.main ابنِ شاحنة واستدعِ المتد:
Truck t = new Truck();
t.horn();
الاستدعاء يشغّل البدنة المكتوبة على Truck، فتطبع الشاشة honk.

Yard Truck implements Signal horn

java
interface Signal {
    void horn();
}

class Truck implements Signal {
    public void horn() {
        System.out.println("honk");
    }
}

public class Yard {
    public static void main(String[] args) {
        Truck t = new Truck();
        t.horn();
    }
}

من المجلد الذي يحوي Yard.java شغّل javac Yard.java. عندما تتطابق الأقواس والأقواس المعقوفة والفواصل المنقوطة، لا يكتب javac سطرًا خاصًا به. ثم شغّل java Yard — وليس java Yard.java. اترك لاحقة .java خارج أمر التشغيل. أبقِ فئة عامة واحدة في الملف ليطابق الاسم Yard. الواجهة Signal والفئة المساعدة Truck تبقيان بلا public في هذا الشكل للمبتدئين.
الشاشة تُظهر honk. امشِ التشغيل مرة. يبدأ Java من Yard.main. new Truck() يبني شاحنة وعدت بـ Signal. t.horn() يشغّل البدنة على Truck ويطبع honk. أنت لا تكتب أبدًا new Signal() — الواجهة تسمّي المتدات؛ الفئة توفّر البدنات والكائن.
إذا رفض javac، تحقق من ثلاثة أمور. أولًا، سطر الفئة يجب أن يقول implements Signal، لا extends Signal. ثانيًا، كل متد واجهة يحتاج متدًا مطابقًا على الفئة. ثالثًا، متد التنفيذ public في هذا الشكل التعليمي ليطابق عقد الواجهة العام. إذا ما زلت ترى beep من ملف override قديم، انتقل إلى ملف تعليم الواجهة وشغّل java Yard مجددًا.
قل القاعدة بصوت عالٍ وأنت تشاهد الشاشة: الواجهة تسمّي الاستدعاء، الفئة تملأ البدنة، الكائن يشغّل تلك البدنة. أبقِ implements على الفئة التي تملك الطباعة. لا تخترع enum في هذه الصفحة. الـ enum ينتظر الدرس التالي.

نفّذ واجهتين على فئة واحدة

البرنامج الثاني يبقي Yard وTruck. الآن Truck ينفّذ واجهتين. Signal ما زال يطلب horn. Mark يطلب show. الفئة تملأ البدنتين. main يستدعي المتدين.

Yard Truck implements Signal and Mark

java
interface Signal {
    void horn();
}

interface Mark {
    void show();
}

class Truck implements Signal, Mark {
    public void horn() {
        System.out.println("honk");
    }
    public void show() {
        System.out.println("truck");
    }
}

public class Yard {
    public static void main(String[] args) {
        Truck t = new Truck();
        t.horn();
        t.show();
    }
}

ترجم بـ javac Yard.java، ثم شغّل java Yard. الشاشة تُظهر honk ثم truck. السطر الأول يأتي من وعد Signal المملوء على Truck. السطر الثاني يأتي من وعد Mark المملوء على نفس الفئة. افصل أسماء الواجهات بفاصلة في قائمة implements: implements Signal, Mark.
اقرأ رأس الفئة مرة أخرى. فئة واحدة. واجهتان. بدنتا متد. هذه الصورة للمبتدئين لحفظ أكثر من وعد دون والدين بـ extends. Java تسمح لفئة أن ترث من فئة واحدة فقط؛ ويمكنها تنفيذ عدة واجهات. هذه الصفحة تُظهر تلك القائمة المفصولة بفاصلة في ملف Yard صغير.
إذا أغفلت show بينما Mark مدرج، يرفض javac لأن كل متد واجهة مدرج يحتاج بدنة. إذا أغفلت Mark من قائمة implements لكنك ما زلت تكتب show، لديك متد عادي، لا وفاء واجهة لـ Mark. أبقِ الاسمين على سطر الفئة عندما تريد فحص الوعدين.

مقارنة مع إعادة التعريف عبر extends

في صفحة إعادة التعريف، كان Truck extends Car وأعاد كتابة horn الذي كان له بدنة أب أصلًا. في هذه الصفحة تبدأ Signal بلا بدنة، وTruck implements Signal يوفّر أول بدنة. ما زلت تترجم Yard.java وتشغّل java Yard. ما زلت تستدعي t.horn(). الرموز الجديدة هي interface وimplements — وفي العرض الثاني — قائمة implements مفصولة بفاصلة.
إذا بقي ملف override مفتوحًا، سترى extends Car وربما beep بجانب honk. انتقل إلى ملف تعليم الواجهة حتى يُظهر أعلى الملف interface Signal ويُظهر سطر الفئة implements. أبقِ عروض enum خارج هذه الصفحة. أبقِ إدخال لوحة المفاتيح خارج هذه الصفحة.

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

هذه الصفحة تملأ متدات الواجهة بـ implements. الصفحة التالية تُظهر enum، حيث يسرد نوع مجموعة ثابتة من الأسماء. ابقَ مع وعود الواجهة هنا. لا تستبدل عروض اليوم بقائمة enum كمتطلب بعد.
عندما تستخدم enum لاحقًا، قد تنفّذ ما زلت واجهات على أنواع أخرى في نفس البرنامج. عامل هذه الصفحة كنصف الواجهة من تلك القصة المجاورة. أنهِ عروضي Yard حتى يبدو honk — ثم honk مع truck — تلقائيًا قبل أن تفتح درس enum.

قبل enum

يمكنك كتابة interface Signal مع horn() فارغ، وتنفيذه على Truck، ورؤية honk من t.horn(). يمكنك تنفيذ Signal وMark على فئة واحدة ورؤية honk ثم truck. ترجم Yard.java وشغّل java Yard لكل عرض تحتفظ به. الفئة أوفت بوعود الواجهة. الصفحة التالية هي enum، حيث يسرد نوع أسماء ثابتة.
أبقِ عرض الواجهة الواحدة مع honk لقصة implements واضحة. أبقِ عرض الواجهتين لقائمة فاصلة واضحة. أبقِ ملفات enum خارج هذه الصفحة. هذه العادات الثلاث نقطة تفتيش قبل المتابعة. عندما يظهر honk بعد t.horn() — وعندما يطبع العرض الثاني أيضًا truck بعد show() — أدّت الواجهات عمل هذا الدرس وأنت جاهز للموضوع التالي عن enum.
مرور أخير على المجلد: Yard عام واحد، رؤوس واجهة بمتدات فارغة، فئة implements لها، بلا انتظار لوحة مفاتيح، بلا enum مفروض. شغّل javac Yard.java وjava Yard مرة أخرى على العرض المفتوح. إذا ما زالت الشاشة تطبع تعبئات الواجهة التي كتبتها، فالوعود ثابتة ويمكن للدورة أن تنتقل إلى enum في الصفحة التالية.

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

جاهز للبدء

اختبر معرفتك

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

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

📝 التعليمات

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