首页 > 编程语言 > 详细

Java静态绑定与动态绑定

时间:2021-04-10 23:11:31      阅读:44      评论:0      收藏:0      [点我收藏+]

Java静态绑定与动态绑定

绑定的概念

? 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定.

静态绑定

? 在程序执行前方法已经被绑定(也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法),此时由 编译器或其它连接程序实现。针对java简单的可以理解为程序编译期的绑定;这里特别说明一点,java当中的方法只有final,static,private和构造方法是前期绑定。

? private:不能被继承,则不能通过子类对象调用,而只能通过类本身的对象进行调用,所以可以说private方法是和方法所属的类进行绑定;

? final:可以被继承,但是不能被重写(覆盖),虽然子类对象可以调用,但是调用的都是父类中的final方法(因此可以看出当类中的方法声明为final的时候,一方面可以防止方法被覆盖,一方面有效关闭java的动态绑定,在程序编译的时候就会绑定起来)(想到final突然想到了String就是使用final修饰的,那么我们都知道他引用的对象值是不能进行修改的,当然,有些时候String类型的值进行了改变,本质不是修改的对象本身,而是引用关系);

? static:可以被子类继承,但是不能被子类重写(覆盖),

动态绑定

? 在运行时根据具体对象的类型进行绑定。若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说, 编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的。但我们至少可以这样认为:它们都要在对象中安插某些特殊类型的信息。

动态绑定的过程分为以下几个环节:

  (1)编译器查看对象的声明类型和方法名;

  (2)编译器查看调用方法时提供的参数类型。例如x.f("hello")(x:类名;f:方法名,下同),编译器将会挑选f(String),而不是f(int),不过存在类型转换(int可以转换成double,Manager可以转换成Employee,等等)。如果编译器没找到参数类型匹配的方法,或者发现有多个方法与之匹配,就会报告一个错误。

  至此,编译器获得了需要调用的方法名字和参数类型。

  (3)采用动态绑定调用方法的时候,一定调用与所引用对象的实际类型最合适的类的方法。如果x的实际类型是D,它是c类的子类,如果c定义了一个方法f(String),就直接调用它,否则将在D类的超类(父类)即c类中寻找f(String),以此类推。

  注:

  • 每次调用方法都要进行搜索,时间开销太大,所以虚拟机预先为每个类创建一个方法表(method table),其中列出了所有方法的签名和实际调用的方法。这样在调用方法的时候,只需要查找这个表即可。
  • 初始化子类对象时,调用的顺序:

调用顺序:父类静态,子类静态,父类非静态,父类构造,子类非静态,子类构造

Java静态绑定与动态绑定

原文:https://www.cnblogs.com/tranprimit/p/14641503.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!