天天看点

白话关于JAVA多态中的动态绑定

数据抽象,继承,多态是java的三大特征,可见理解多态对于学习java的重要性,多态不但能够改善代码的组织结构和可读性,还能够让程序更加的具有可拓展性。

那什么是绑定呢?绑定就是说:一个方法的调用与方法所在的类(方法主体)关联起来。简单的来说,我的理解是对象的引用指向的是哪个类,类的类型和方法是否相同,

静态绑定(前期绑定):即在程序执行前,即编译的时候已经实现了该 方法与所在类的绑定,像C就是静态绑定。具体过程就是执行这个方法,只要到这个类的方法表里拿出这个方法在内存里的地址,然后就可以执行了。java中只有static,final,private,和构造方法是静态绑定,其他的都属于动态绑定,而private的方法其实也是final方法(隐式),而构造方法其实是一个static方法(隐式),所以可以看出把方法声明为final,第一可以让他不被重写,第二也可以关闭它的动态绑定。

动态绑定(后期绑定):运行时根据对象的类型进行绑定,java中的大多数方法都是属于动态绑定,也就是实现多态的基础。java实现了后期绑定,则必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说,编译的时候该方法不与所在类绑定,编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。java里实现动态绑定的是JVM.

所谓的动态绑定,其实就是在子类中重写了父类中的方法,当父类引用指向子类对象的时候,调用的方法将不在被使用父类中的方法,取而代之的是子类中的方法。

例如:

public class Persion {

public void run(){

System.out.println("人可以行走");

}

public void speak(){

System.err.println("父类说的话");

}

}

public class Sun extends Persion{

//重写了父类中的speak()方法

public void speak(){

System.err.println("子类说的话");

}

public static void main(String[] args) {

Persion persion=new Sun();

persion.run();

persion.speak();

}

}

以上是我对动态绑定的理解,有不对的地方请大家多多指教