静态绑定和动态绑定有什么区别?

时间:2009-03-13 00:10:47

标签: programming-languages language-design

绑定时间可以分为两种类型:静态和动态。静态绑定和动态绑定有什么区别?

你能举一个快速的例子来进一步说明吗?

5 个答案:

答案 0 :(得分:27)

一般而言,静态绑定表示在编译时解析引用

Animal a = new Animal();
a.Roar(); // The compiler can resolve this method call statically.

动态绑定表示在运行时解析引用

public void MakeSomeNoise(object a) {
   // Things happen...
   ((Animal) a).Roar(); // You won't know if this works until runtime!
}

答案 1 :(得分:6)

它取决于何时发生绑定:在编译时(静态)或在运行时(动态)。调用简单类方法时使用静态绑定。当您开始处理类层次结构和虚方法时,编译器将开始使用所谓的VTABLE。那时编译器并不确切地知道要调用什么方法,它必须等到运行时才能找到要调用的正确方法(这是通过VTABLE完成的)。这称为动态绑定。

有关详细信息和参考资料,请参阅Virtual tables上的维基百科文章。

答案 2 :(得分:0)

静态绑定:是在编译时解析类型,成员和操作 的过程。 例如:

Car car = new Car();
car.Drive();

在此示例中,编译器通过在Drive对象上寻找无参数的car方法来进行绑定。如果没找到那个方法!搜索采用optional parameters的方法,如果没有找到该方法,则再次搜索Car的{​​{3}}中的该方法,如果没有找到该方法,则再次搜索base class Car类型。如果找不到匹配项,则会出现编译错误!

在这种情况下,绑定由编译器完成,并且绑定取决于静态知道对象的类型。这使其成为静态绑定。

动态绑定::动态绑定将绑定(解析类型,成员和操作的过程)从编译时推迟到运行时。 例如:

dynamic d = new Car();
d.Drive();

动态类型 告诉编译器,我们希望d运行时类型具有Drive方法,但我们无法证明它静态。由于d是动态的,因此编译器推迟将Drive绑定到d 运行时间

动态绑定对于在编译时我们知道某个函数操作的成员存在但编译器不知道的情况很有用!当我们与动态编程语言 COM reflection 互操作时,通常会发生这种情况。

答案 3 :(得分:-4)

在编译时完成的绑定是静态绑定,在运行时完成的绑定是动态绑定。在静态绑定中,指针的数据类型解析了调用哪个方法。但是在动态绑定中,对象的数据类型解析了调用哪个方法。

答案 4 :(得分:-5)

*执行时间: - * 将变量绑定到其值,以及在执行时将变量绑定到特定存储位置称为执行时绑定。

可能有两种类型

  1. 进入子程序。
  2. 执行期间的任意点。
  3. 编制时间限制: - (翻译时间) 它包括以下内容。

    1. 程序员选择的绑定。
    2. 译者选择的装订。
    3. 装载机选择的绑定。