اذهب إلى المحتوى

السؤال

نشر (معدل)

لدي الكود بالاسفل

 

class A {



void a(int x,int y){

System.out.println(x+y);
}



void a2(int x,double y){

System.out.println(x+(int)y);
}


}





class B extends A {


@Override
void a2(int x,double y){

System.out.println(x+(int)y+4);

}






public class Test {
  
  
  
  public static void main(String[] args) {

    
   A b=new B();
    
    b.a2(2,2.0);
    }

 

 

النتيجة تكون 8

اي الميثود من بي تم استدعاؤها

 

في الواقع انا لا اعرف كيف اصيغ السؤال جيدا لكن ساحاول

 

اليس الكود بالاعلى هو overloading ؟؟؟؟

 

لو لم يكن كذلك فما هو ولما هو ليس كذلك ؟؟؟؟

 

وان كان كذلك فكيف تم استدعاء الميثود في B

لان ال overloading is a static binding

وايضا ال compiler لا يعرف ما هو الشيء الذي يشير اليه b في ال compile time حسب علمي

 

 

ولماذا ال overloading هو static  binding في الاساس لانه حتى لو كان هنالك overloading في بعض الحالات يمكنني ان اقوم ب overriding لل overloaded method

 

وايضا شيء اخر

من اي مكان يتم اخذ الميثود المراد استدعاؤها

من ال object ام من ال method area

لانه حسب علمي يتم تحويل الجافا فايل الى كلاس فايل وبعدها يتم انشاء كود مطابق للكود الذي في الكلاس فايل ووضعه في ال method area 

وهذا يعني ان الميثود المكتوبة في الكلاس  تقريبا يتم نقلها لل method area صحيح ؟؟؟؟

 

رجاء لو لم تفهم اي شيء من السؤال قل لي لكي احاول ان اصيغه بطريقة افضل (;

 

تم التعديل في بواسطة Freshlybaked Chocolatechip

Recommended Posts

  • 0
نشر (معدل)

- قبل كل شيء عليك أن تعلم ما هو الفرق بين overloading و overriding وهو التالي:

Method overriding : عندما الكلاس الابن يعيد تعريف نفس ال method في الكلاس الأب بنفس البارامترات.
Method overloading : المقصود به تعريف عدة methods في نفس الكلاس والتي تقبل أعداد وأنواع مختلفة من البارامترات ، في هذه الحالة يتم تحديد ال method التي يتم استدعاؤها في وقت التجميع (compile time) بناءً على عدد بارامترات التابع وأنواعها.

بناءً على ما سبق فإن الكود  في الأعلى (الذي أنت تسأل عنه) هو overriding ، حيث تم إعادة تعريف التابع a2 بنفس البارامترات (int x , double y) ، ولا شك بأن العبارة Override@  الموجودة قبل التابع a2 في الكلاس B تؤكد ذلك.

وللإجابة عن سؤالك (فكيف تم استدعاء الميثود في B) لاحظ معي التالي

   A b=new B();

أنت تعلم ، من خلال دراستك لأساسيات البرمجة أن المعامل "=" يعني عملية إسناد (وليس يساوي) أي إسناد ما على يمين المعامل إلى الكائن الذي على يسار المعامل ، في حالتك أنت تم إسناد كائن من الكلاس B إلى كائن من الكلاس A بالتالي أصبح الكائن b هو فعلياً كائن من الكلاس B فلا عجب أن يتم استدعاء التابع a2 في الكلاس B

تم التعديل في بواسطة ابراهيم محمد11

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...