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

ماهو dynamic biding و static biding

الشيخ المختار الشنقيطس

السؤال

Recommended Posts

  • 1

السلام عليكم أخي,

يشير static binding إلى تنفيذ برنامج حيث يتم معرفة type of object في وقت الترجمة، أي عندما ينفذ المترجم الشفرة، فإنه يعرف نوع object أو class التي ينتمي إليها.بينما في حالة dynamic binding يتم تحديد object في وقت التشغيل.

ببساطة يستخدم static binding ال type of class للربط, بينما يستخدم dynamic binding نوع الكائن type of object حيث أن resolution تحدث فقط في وقت التشغيل لأن object الذي تم إنشاؤه فقط أثناء وقت التشغيل بسبب أن الربط الديناميكي يصبح أبطأ مما هو عليه في حالة الربط الثابت.

دعنا نرى المثال التالي لتصلك الفكرة أدق:
 

بخصوص الربط الثابت:

1.png.eb7486c20a9c9f9546d553455f886d60.png

والخارج هو

2.png.e49af06ffdfd5e02ef23d37249055d2d.png

 

بينما في الربط الدينامكي:

3.png.19b4737317908b8c08dc4dd53770dbb0.png

والخارج هنا سيكون

4.png.c6527129d90e5aff66f0f3045a22c907.png

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

مرحباً @الشيخ المختار الشنقيطس
يتمثل الفرق بين الربط الثابت ( static binding ) و الربط الديناميكي ( dynamic binding ) في لغة جافا في:

  • الربط الثابت يحدث أثناء الترجمة و التفسير ( compile time ) بينما الربط الديناميكي يحدث أثناء تشغيل البرنامج ( Runtime )
  • التوابع ( methods ) و المتغيرات المحددة ك private او static او final تستخدم الربط الثابت بينما يتم ربط التوابع الأخرى ديناميكياً إعتماداً على كائن وقت التشغيل
  • الربط الثابت يستخدم نوع الكلاس بينما الربط الديناميكي يستخدم نوع الكائن 
  • في ال overloaded methods يتم إستخدام الربط الثابت بينما في ال overridden methods يتم إستخدام الربط الديناميكي.

و هذا مثال عن  overloaded methods 

public class StaticBindingTest {  
    public static void main(String args[]) {
        Collection c = new HashSet();
        StaticBindingTest et = new StaticBindingTest();
        et.sort(c);
    }
    //overloaded method takes Collection argument
    public Collection sort(Collection c) {
        System.out.println("Inside Collection sort method");
        return c;
    }
    //another overloaded method which takes HashSet argument which is sub class
    public Collection sort(HashSet hs) {
        System.out.println("Inside HashSet sort method");
        return hs;
    }
}

و الخارج سيكون:

Inside Collection sort method

لأنه نظراً للنقطة 4 فإنه تم إستخدام الربط الثابت إضافةً للنقطة 3 فإن الربط الثابت يعتمد على نوع الكلاس و في هذه الحالة نوع الكلاس هو Collection

و هذا مثال آخر عن overridden methods

public class DynamicBindingTest {   
    public static void main(String args[]) {
        Vehicle vehicle = new Car(); //here Type is vehicle but object will be Car
        vehicle.start(); //Car's start called because start() is overridden method
    }
}

class Vehicle {
    public void start() {
        System.out.println("Inside start method of Vehicle");
    }
}

class Car extends Vehicle {
    @Override
    public void start() {
        System.out.println("Inside start method of Car");
    }
}

و الخارج سيكون:

Inside start method of Car

لأنه نظراً للنقطة 4 فإنه تم إستخدام الربط الديناميكي (overridden method) إضافةً للنقطة 3 فإن الربط الديناميكي يعتمد على نوع الكائن و في هذه الحالة نوع الكائن هو Car

المصدر: Javarevisited blog post

بالتوفيق

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

 

  • static binding

عندما يتم تحديد نوع ال object في وقت  compiler time (بواسطة المترجم) ، يُعرف باسم  static biding, إذا كان هناك أي  دالة  private أو final أو static داخل الكلاس  يعتبر الإرتباط ثابت 

مثال: 

class Dog{  
 private void eat(){System.out.println("dog is eating...");}  
  
 public static void main(String args[]){  
  Dog d1=new Dog();  
  d1.eat();  
 }  
  • Dynamic binding

عندما يتم تحديد نوع الكائن في وقت التشغيل ، يُعرف باسم الربط Dynamic biding

مثال 

class Animal{  
 void eat(){System.out.println("animal is eating...");}  
}  
  
class Dog extends Animal{  
 void eat(){System.out.println("dog is eating...");}  
  
 public static void main(String args[]){  
  Animal a=new Dog();  
  a.eat();  
 }  
}  

لوقمت بتنفيذ الكود سيكون الناتج  

Output:dog is eating...

في المثال أعلاه ، لا يمكن  لل compiler تحديد نوع الكائن ، لأن instance Dog هو أيضًا instance لـ Animal. لذلك لا يعرف compiler نوعه,  أي أنه يتم تحديد النوع وقت التشغيل .

تم التعديل في بواسطة Omar Haddad2
رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...