Method Overloading与Method Overriding均属动态多态吗?Java学习疑问
方法重载与多态类型的争议解析
主流技术结论
- 方法重载(Overloading)属于静态(编译期)多态:编译阶段Java编译器就能根据调用时传入的参数数量、类型、顺序,精确匹配到对应的重载方法,无需等到运行期。
- 方法重写(Overriding)属于动态(运行期)多态:运行时JVM会根据调用方法的对象的实际类型,决定执行父类还是子类的重写方法。
对书中观点的纠正
你参考的《Core Java An Integrated Approach》中认为重载属于动态多态的理由存在错误:
书中称“编译器在编译时无法确定用户实际调用的方法,必须等待Sample类的对象创建完成,因此JVM在运行时决定调用哪个方法”
这个逻辑不成立:方法重载的匹配只依赖调用时的参数信息,和对象是否创建无关。比如在代码中写new Sample().add(1,2),编译期就已经确定要调用两个参数的add方法,JVM运行时只是执行这个已确定的方法,不存在运行期选择的过程。
书中Note的合理性
书中提到的static、private、final方法的重载/重写属于静态多态是正确的:
- static方法属于类,调用时直接绑定到类,编译期即可确定;
- private方法无法被子类重写,子类的同名方法是独立的新方法,编译期绑定;
- final方法禁止被重写,调用时也是编译期绑定。
内容的提问来源于stack exchange,提问作者Pratik Tushar Cholke
相关产品推荐
相关产品推荐

