Java父类do(double)与子类do(int):重写还是重载?调用疑问
问题解答
子类的
do(int in)方法属于重载,而非重写。Java中方法重写要求方法签名完全一致(方法名、参数类型、数量、顺序必须完全匹配),int和double是不同的参数类型,因此不满足重写的判定条件,子类和父类的两个do方法属于重载关系。关于代码
Superclass subclass = new Subclass(); subclass.do(10);的执行逻辑:- 编译阶段:编译器依据**引用类型
Superclass**来查找可用方法。Superclass中仅存在do(double)方法,传入的int类型参数可自动向上转型为double,因此编译器会在字节码中写入对Superclass.do(double)的方法调用指令。 - 运行阶段:JVM会严格按照字节码中记录的方法签名进行实现绑定。由于子类并未重写
do(double)方法,JVM最终会调用父类的do(double)实现;子类的do(int)方法签名与字节码中记录的不匹配,因此不会被执行。
- 编译阶段:编译器依据**引用类型
你之前预期调用子类
do(int)的误区在于混淆了编译期和运行期的绑定逻辑:编译期已确定要调用的方法签名是do(double),运行期只会匹配该签名的方法实现,而非根据传入参数的原始类型去查找子类的其他重载方法。
内容的提问来源于stack exchange,提问作者abh77
相关产品推荐
相关产品推荐

