动态绑定和静态绑定

绑定指的是把方法名和对应的方法联系在一起。什么时候需要绑定呢?

  1. 方法有重载时。因为有多个同名方法,所以根据参数列表确定是哪个方法。是为静态绑定
  2. 方法有重写时。子类对父类的方法进行了重写。当用父类的指针调用某个方法时,要确定到底调用的是哪个类的方法。是为动态绑定。

要理解,先要说下对象的内存模型

对象中有段空间是用来保存类信息的,其中就有函数表的指针。函数表是个什么东西?可以理解为在编译阶段类的方法被编译放在一段内存中。而且会生成一个方法表(可以把它理解成一个数组),表里面依次保存着方法的指针。比如有三个重载的方法,他们在表里的位置为 1,2 ,3。那么在编译阶段就会根据参数列表发生静态绑定,比如说绑定到 2。这时编译器是不管这个 2 是父类的 2,还是子类的 2 的。而子类的方法和父类的同名同参数列表的方法在方法表中的顺序是一样的。在运行时,从对象的函数表里去取相应的函数。这时才发生了最终的绑定,也可以说动态绑定。

你可能感兴趣的:(动态绑定和静态绑定)