静态绑定与动态绑定

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方法的静态绑定与动态绑定讲解(向上转型的运行机制详解)

Java : 多态表现:静态绑定与动态绑定(向上转型的运行机制)

Java 动态绑定 静态绑定