5- java多态的动态绑定

动态绑定的概念:
动态绑定是对象调用方法时的默认处理方式,对象的声明类型是多变的,
在实际运行过程中,虚拟机能自动选择调用哪个方法,这样的过程叫做动态绑定。
x.f(String) D extends X;
处理的过程
1.编译器查看对象的声明类型与方法名,
此时编译器会记录类C中名为f的所有方法和及其超类中访问修饰符为public名为f的方法;
2.其次要进行重载解析,
重载解析在于,编译器会根据运行时传递的参数的类型来查找f方法;
3.如果是private ,static, final修饰的方法或者构造器,编译器直接可以知道调用的是哪个方法,
这种调用方式称为静态绑定。反之,调用的方法依赖于隐式参数的实际类型来动态的绑定,
才能确定调用哪个方法。
4.如何进行动态绑定调用方法,首先虚拟机会为每个类创建一个区,存放方法表的。
每个类都有自己的方法表,子类也有超类的方法表和自己添加的方法表。
虚拟机运行时,会明确x的声明类型,如果是X类型,虚拟机就会搜索X类型中的方法表,通过参数类型
找到相应的方法;如果是D类型,那么就会搜索D类型的方法表,找到就执行,没有就报错!

overload:重载
override:重写,子类的重写的访问权限应该不小于超类的访问权限,编译不能通过,
提示Cannot reduce the visibility of the inherited method from Employee
试图降低访问权限。

final

修饰的方法称为不可扩展的类,不可继承的类。
修饰类 定义在声明部分,final class Employee(){}
修饰方法 定义在声明部分, public final method01(){}
定义的方法不可在子类中覆盖,重写。
修饰域 定义在成名部分, final String baseListObject
对于域构造对象之后,就不允许改变他们的值了
修饰局部变量 定义在形式参数中,public void method01(final BaseListObject baseListObject){}
定义之后构造参数,或者传递过来的参数不允许修改。

原文地址:https://www.cnblogs.com/alisonGavin/p/7430187.html