Java多态中的动态绑定与静态绑定

Java虚拟机的动态绑定与静态绑定

大家可能都知道Java面向对象的三大特性,封装,继承,多态,其中动态绑定就与多态有关,那什么是动态绑定呢?

1.动态绑定(auto binding):也叫后期绑定,在运行时,虚拟机根据具体对象的类型进行绑定,或者说是只有对象在虚拟机中创建了之后,才能确定方法属于哪一个对象,与引用变量实际引用的对象绑定,调用重写的方法,由运行的JVM决定。
2.静态绑定static binding:由(final、static、private)修饰符 构成,在程序执行前已经被绑定,也就是说在编译过程中就已经知道这个方法是哪个类的方法,此时由编译器获取其他连接程序实现。

这里概念可能不好理解,直接上代码

//创建一个父类
public class Father {
    public void m1(){
        System.out.println("我是父类中的实例方法m1!");
    }
    //静态修饰方法
    public  static void staticM1(){
        System.out.println("我是父类中的静态方法m1!");
    }
}

这里创建子类,子类继承父类的方法并重写分类中的方法和一个具有static修饰的静态方法

//实例方法
public class Son extends Father{
    public void m1(){
        System.out.println("我是子类重写父类的实例化方法m1!");
    }
    
    //子类静态方法
    public  static void staticM1(){
        System.out.println("我是子类中的静态方法m1!");
    }
}

为了达到更好的达到验证效果,创建一个测试类

//测试类
public class Test {
    public static void main(String[] args){
        //向上转型,父类引用指向子类对象
        Father f = new Son();

        //实例方法(动态绑定机制)与引用变量实际引用的对象绑定,调用重写的方法,由运行的JVM决定
        f.m1();
        System.out.println();
        //静态方法(静态绑定机制)与引用变量所声明的类型绑定  实际在编译阶段就做了绑定
        f.staticM1();
    }
}
    }
}

最后看一下运行结果Java多态中的动态绑定与静态绑定_第1张图片

总结

PS:由于动态绑定需要在运行时确定执行哪个版本的方法实现或者变量,比起静态绑定起来要耗时。所以在不影响整体设计,我们可以考虑将方法或者变量使用private,static或者final进行修饰

创作不易,给点鼓励

你可能感兴趣的:(Java多态中的动态绑定与静态绑定)