参考https://blog.csdn.net/m0_37700275/article/details/88556739、 java核心11 p164
隐式参数和显示参数
- 隐式参数 方法前的对象 例如x.function()中的x
- 显示参数 方法名后括号内的参数 例如void function(int y)中的int y
动态绑定和静态绑定
- 绑定:将方法和类或者对象关联起来
- 方法表:虚拟机预先为每个类计算了一个方法表列出了所有方法签名和实际要调用的方法
- 区别:静态绑定是运行前,动态绑定是运行中
-
静态绑定
- 如果修饰符有static final private 或者是构造器,不依赖与隐式参数的类型,编译时可以直接准确的知道该调用哪个方法。
-
动态绑定
- 依赖于隐式参数来调用方法
- 过程:
- 编译检查时:编译器通过隐式参数类型看方法表中是否存在对应方法。
- 运行时:调用实例对象方法表中的方法。
方法调用过程(对象调用)
- 编译器查看对象引用的类型和方法名,得到引用中所有匹配的候选方法
- 编译器找到一个参数类型完全匹配的方法,不然报错
- 判断是否为动态绑定,如果是静态,已经找到对应方法。
- 如果是动态绑定寻找实例对象的方法表,找到对应方法。
- 虚拟机调用对应方法
这也解释了重写的两个问题:
- 为什么重写的方法权限修饰符大于等于父类
- 为什么重写的方法抛出异常小于等于父类
原因
在编译时通过引用变量类型来对方法进行检查,如果通过,那么我在运行时调用其他重写的方法也一定会成功。