静态绑定与动态绑定
Posted liangyueyuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了静态绑定与动态绑定相关的知识,希望对你有一定的参考价值。
静态绑定
静态绑定(前期绑定)是指:在程序运行前就已经知道方法是属于那个类的,在编译的时候就可以连接到类的中,定位到这个方法。
在Java中,final、private、static修饰的方法以及构造函数都是静态绑定的,不需程序运行,不需具体的实例对象就可以知道这个方法的具体内容。
~举个栗子
//静态绑定 public class binding { public static class superclass{ static void print(){ System.out.println("print in superclass"); } } public static class subclass extends superclass{ static void print(){ System.out.println("print in subcalss"); } } public static void main(String[] args) { superclass A = new superclass(); superclass B = new subclass(); A.print(); B.print(); } }
~运行结果
~分析说明
在java中,允许子类重写父类的方法,但是,在这里的方法是静态的,即在编译期间虚拟机已经加载了该方法,并且进行了相关的绑定,知道了该方法不可以被重写,所以,当子类去调用方法的时候只会调用父类的方法
动态绑定
动态绑定(后期绑定)是指:在程序运行过程中,根据具体的实例对象才能具体确定是哪个方法。
~举个栗子
public class Test9 { public static class superclass{ void print(){ System.out.println("print in superclass"); } } public static class subclass extends superclass{ void print(){ System.out.println("print in subcalss"); } } public static void main(String[] args) { superclass A = new superclass(); superclass B = new subclass(); A.print(); B.print(); } }
~运行结果
~分析说明
这种就是java中的重写操作,子类的覆盖了父类的同名方法,当子类对象在调用的之前,并不会知道它自己要调用的是哪个方法,只有等到运行时才能确定
总结
private、final、staic成员(方法和变量)使用静态绑定,而对于动态绑定是在运行时基于进行时对象完成的。
静态绑定使用类型信息进行绑定,而动态绑定使用对象来解析绑定。
在使用动态绑定(即进行时)的重写方法时,使用静态绑定解析重载方法。
以上是关于静态绑定与动态绑定的主要内容,如果未能解决你的问题,请参考以下文章
Java方法的静态绑定与动态绑定讲解(向上转型的运行机制详解)