欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java基础:多态过程中的动态绑定

程序员文章站 2024-02-09 18:05:54
...

重刷java-core的chapter05,P158

重读多态,感觉又不一样了。

记录一下对象方法执行过程:

1.  编译器查看对象声明类型和方法名,如class.fuction(param),class声明为A对象,则列出所有A的function(param)和父类中的public的function(param)。

Employee {
...
getSalary(){} } Manager extends Employee{ ...
getSalary(){} }
Manager managerA
Employee e =managerA
e.getSalary(){}

  这里会列出 e 的getSalary,e的父类的public的getSalary,e的所有子类的getSalary。

 

2. 重载解析overloading resolution :查看调用方法时提供的参数类型。如查看param是int还是String,由于允许类型转换,如int转换成double,son可以转换成father等等,发现多个或者没有匹配的参数,会报错。

3.如果时private/static/final方法,或者构造器,那么编译器可以准确的知道应该调用哪个方法,这种调用方式成为静态绑定static binding。于此对应的是,调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定,生成调用fuction(param)的指令。

4.当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用与class所引用对象的实际类型最合适的那个类的方法。假设class的实际类型时son,它是father的子类。如果son定义了fuction(param),就直接调用;否则,调用father的public function(param),以此类推。

   1的例子中,e的实际类型是Employee的子类对象Manager,所以调用Manager的getSalary().

 

由于调用方法用搜索,很花时间。虚拟机会先为每个类创建一个方法表,到时候直接从表里面找。