الطريقة الافتراضية لواجهة Java8
ما هي الطريقة الافتراضية ولماذا هناك طريقة افتراضية؟
ببساطة ، يمكن أن يكون للواجهة طرق تنفيذ ، وليس هناك حاجة لتنفيذ الفصل لتنفيذ أساليبها. فقط أضف الكلمة الرئيسية الافتراضية قبل اسم الطريقة.
لماذا تحتاج هذه الميزة؟ بادئ ذي بدء ، كانت الواجهة السابقة سيفًا ذو حدين. كانت الميزة أنها كانت تهدف إلى البرمجة المجردة بدلاً من البرمجة الملموسة. كان العيب أنه عندما كان من الضروري تعديل الواجهة ، كان من الضروري تعديل جميع الفئات التي طبقت الواجهة. لم يكن لدى إطار المجموعة الحالي قبل Java 8 طريقة foreach. الحل الذي يمكن التفكير فيه هو إضافة طرق وتطبيقات جديدة إلى الواجهات ذات الصلة في JDK. ومع ذلك ، بالنسبة للنسخة المنشورة ، من المستحيل إضافة طرق جديدة إلى الواجهة دون التأثير على التنفيذ الحالي. لذلك تم تقديم الطريقة الافتراضية. هدفهم هو جعل الواجهة غير متوافقة مع التطبيقات الحالية.
كما هو موضح أدناه ،
الواجهة العامة Animal {default void eat () {system.out.println ("Animal Eat Method Method") ؛ }} تم الإعلان عن واجهة ، وهناك طريقة افتراضية واحدة فقط في الداخل. ثم اكتب فئة محددة لتنفيذ هذه الواجهة.
يقوم كلب الطبقة العامة بتنفيذ Animal {public void sayhi () {system.out.println ("dog") ؛ } public static void main (String args []) {dog dog = new dog () ؛ dog.eat () ؛ }}في فئة محددة ، ليس من الضروري تجاوز الطريقة الافتراضية ، ولكن يجب تنفيذ الطرق المجردة.
وراثة متعددة للطرق الافتراضية
الرمز الموضح أدناه ،
الواجهة العامة A {void dosomething () ؛ void void hello () {system.out.println ("Hello World from Interface A") ؛ } الافتراضي void foo () {system.out.println ("foo from interface a") ؛ }} الواجهة B يمتد {الافتراضي void hello () {system.out.println ("Hello World from Interface B") ؛ A.Super.Hello () ؛ this.foo () ؛ A.Super.foo () ؛ }} Class C تنفذ B ، A {Override public void dosomething () {system.out.println ("C object exe شيء") ؛ } public static void main (String args []) {a obj = new c () ؛ obj.hello () ؛ // call b's method obj.dosomething () ؛ }}نتيجة الطباعة:
Hello World من Interface Bhello World من واجهة AFOO من واجهة AFOO من واجهة AC كائن بحاجة
يقوم OBJ.Hello () باستدعاء الطريقة الافتراضية في الواجهة B. في نفس الوقت ، تستدعي الطريقة الافتراضية في الواجهة B الطريقة الافتراضية في الواجهة الأصل.
دعنا نلقي نظرة على مثال آخر ونفكر في الطريقة الافتراضية بنفس الاسم في ميراث متعدد ، كما هو موضح أدناه.
الواجهة العامة d {افتراضي void hello () {system.out.println ("Hello World from d") ؛ }} واجهة e {الافتراضية void hello () {system.out.println ("Hello World from e") ؛ }} class f تنفذ d ، e {Override public void hello () {system.out.println ("Hello World F class") ؛ D.Super.Hello () ؛ E.Super.Hello () ؛ } public static void main (string args []) {f f = new f () ؛ F.Hello () ؛ }} نحتاج إلى صياغة الطريقة الافتراضية التي تتم الاتصال بها على النحو التالي:
D.Super.Hello () ؛ E.Super.Hello () ؛
مثال آخر على الطريقة الافتراضية لـ Java8 :
أضافت Java8 طريقة افتراضية للواجهة ، مما يعني أنه يمكن تنفيذها في الواجهة. طريقة التنفيذ هذه هي التنفيذ الافتراضي ، ويمكنك أيضًا إعادة كتابة هذه الطريقة الافتراضية في فئة تطبيق الواجهة.
المثال التالي:
الفئة العامة APPINTERFEDEFAULTMETHOD {public static interface defaultMethodDemo {// حدد الطريقة الافتراضية ، مع الكلمة الرئيسية الافتراضية التي تسبقها الطريقة الافتراضية ، تليها إعلان الطريقة والأسلوب demo void void (إدخال السلسلة) {system.out.println (الإدخال) ؛ } void dosomething () ؛ } تنفذ الفئة الثابتة العامة democlass defaultMethodDemo {Override public void dosomething () {system.out.println ("do something") ؛ }}} الفئة الثابتة العامة democlassoverRideMo تنفذ defaultMethodDemo {// إعادة كتابة الطريقة الافتراضية override public void demo (string input) {system.out.println ("demo" + input + "by override method") ؛ } Override public void dosomething () {system.out.println ("do something") ؛ }} public static void main (string [] args) {defaultMethodDemo demo = new democlass () ؛ Demo.Demo ("ABC") ؛ DefaultMethodDemo DemooverRide = جديد democlassoverridedemo () ؛ demooverride.demo ("ABC") ؛ }}ما سبق هو مقدمة مفصلة للطريقة الافتراضية لواجهة Java8 ، وآمل أن تكون مفيدة لتعلم الجميع.