سؤال

أنا أتدرب على الامتحان وجدت عينة المشكلة أن يحصل لي فقدت تماما.للحصول على التعليمات البرمجية التالية تجد ما الناتج هو:

class Moe {
    public void print(Moe p) {
        System.out.println("Moe 1\n");
    }
}
class Larry extends Moe {
    public void print(Moe p) {
        System.out.println("Larry 1\n");
    }
    public void print(Larry l) {
        System.out.println("Larry 2\n");
    }
}
class Curly extends Larry {
    public void print(Moe p) {
        System.out.println("Curly 1\n");
    }
    public void print(Larry l) {
        System.out.println("Curly 2\n");
    }
    public void print(Curly b) {
        System.out.println("Curly 3\n");
    }
}
public class Overloading_Final_Exam {
    public static void main (String [] args) {
        Larry stooge1 = new Curly();
        Moe stooge2 = new Larry();
        Moe stooge3 = new Curly();
        Curly stooge4 = new Curly();
        Larry stooge5 = new Larry();
        stooge1.print(new Moe()); 
        ((Curly)stooge1).print(new Larry()); 
        ((Larry)stooge2).print(new Moe()); 
        stooge2.print(new Curly()); 
        stooge3.print(new Curly()); 
        stooge3.print(new Moe()); 
        stooge3.print(new Larry()); 
        ((Curly)stooge3).print(new Larry()); 
        ((Curly)stooge3).print(new Curly()); 
        stooge4.print(new Curly()); 
        stooge4.print(new Moe()); 
        stooge4.print(new Larry()); 
        stooge5.print(new Curly()); 
        stooge5.print(new Larry()); 
        stooge5.print(new Moe()); 
    }
}

كان لي أفكار في العقل ، ولكن بعد ذلك عندما ركضت جافا, لدي شيء مختلف تماما:

Curly 1
Curly 2
Larry 1
Larry 1
Curly 1
Curly 1
Curly 1
Curly 2
Curly 3
Curly 3
Curly 1
Curly 2
Larry 2
Larry 2
Larry 1

القليلة الأولى منها هي موافق ولكن بعد ذلك أنا حقا لا أفهم.أي شخص لديه تفسير لهذه المشكلة ؟

شكرا

هل كانت مفيدة؟

المحلول

وأود أن تبدأ من خلال رسم صورة...

Moe - print(Moe)
 |
Larry - print(Moe), print(Larry)
 |
Curly - print(Moe), print(Larry), print(Curly)

ثم أود أن تتبع المتغيرات:

  • لاري - stooge1 -> مجعد
  • وزارة التربية - stooge2 -> لاري
  • وزارة التربية - stooge3 -> مجعد
  • مجعد stooge4 -> مجعد
  • لاري - stooge5 -> لاري

  • stooge1.print(new Moe())

    • stooge1 -> مجعد حتى المكالمات مجعد.طباعة(وزارة التربية والتعليم)
  • ((Curly)stooge1).print(new Larry());

    • stooge1 -> مجعد حتى المكالمات مجعد.طباعة(الجديد لاري())
  • ((Larry)stooge2).print(new Moe());

    • stooge2 -> لاري حتى المكالمات لاري.طباعة(جديد مو());
  • stooge2.print(new Curly());
    حسنا, هذا هو المكان الذي تحصل عليه اصعب قليلا (آسف توقفت واحد قبل هنا)

    • stooge2 تعلن وزارة التربية.لذلك عندما مترجم تبحث في ما يطلق عليه هو الذهاب الى دعوة الطباعة(مو) الأسلوب.ثم في وقت التشغيل فهو يعرف أن stooge2 هو لاري لذلك يدعو لاري.طباعة(مو) الأسلوب.

الخ...

اسمحوا لي أن أعرف إذا كان بعد ذلك كل طريق لا يعمل بالنسبة لك.

(تحديث توضيح التالي)

لذا فإن القاعدة العامة هي:

  • المترجم يبدو في متغير من نوع أن تقرر ما هي طريقة الاتصال.
  • في وقت تبدو في الدرجة الفعلية التي المتغير هو النقطة في أن تقرر أين يمكن الحصول على طريقة من.

لذلك عندما يكون لديك:

Moe stooge2 = new Larry();
stooge2.print(new Moe());

المترجم يقول:

  • يمكن أن لاري أن تسند إلى stooge2?(نعم كما لاري هو فئة فرعية من وزارة التربية والتعليم)
  • لا مو لها طباعة(مو) الأسلوب ؟ (نعم)

وقت التشغيل يقول:

  • أنا من المفترض أن يتصل الطباعة(مو) طريقة على هذا الكائن...stooge2
  • stooge2 هو نقطة في لاري.
  • سأتصل الطباعة(مو) طريقة في لاري الدرجة.

مرة واحدة كنت قد عملت كل ذلك محاولة التخلص من بعض الأساليب ونرى كيف أن يغير الأمور.

نصائح أخرى

في الواقع، هذه المشكلة ليست بسيطة كما يبدو، منذ جافا على حد سواء ثابتة وملزمة بشكل حيوي. يجب أن نفهم حيث يتم تطبيق كل قبل تفهمون كل النتائج التي يتم الحصول من هذا التمرين.

والقاعدة العامة التي TofuBeer المذكورة صحيحة إلا في حالة ملزمة الديناميكية. في ملزمة ثابت، يتم اتخاذ القرارات فقط في وقت الترجمة.

والمثال لديك يمزج دينامية ملزمة (عندما يتم تجاوز الأساليب) وثابت ملزم (عندما يتم فوق طاقتها الأساليب).

ونلقي نظرة في هذا السؤال للحصول على مزيد من التفاصيل .

وهناك تلميح هو تجاهل القيمة على الجهة اليسرى عند النظر إلى الأشياء. بدلا من ذلك، ننظر إلى قيمة الحق خلال الإعلان، هذه هي القيمة الفعلية للكائن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top