• 0

ما هو نوع هذا ال binding في java

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

 

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

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 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

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن