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();
}
}
}
}
最后看一下运行结果![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/0fd1d07c6906c3983996aaf9cb50df06.png)
总结
PS:由于动态绑定需要在运行时确定执行哪个版本的方法实现或者变量,比起静态绑定起来要耗时。所以在不影响整体设计,我们可以考虑将方法或者变量使用private,static或者final进行修饰
创作不易,给点鼓励👊👊