为何Java向上转型后无法自动调用子类的同名greet()方法?
原因解析
这本质是Java编译期检查和运行期动态绑定的分工差异:
编译期只认变量的声明类型
Java编译器在处理a.greet()时,只会看变量a的声明类型是A,然后检查A类中是否有可被当前类(Main)访问的greet()方法。因为A的greet()是private,属于A类的内部私有实现,Main类完全看不到这个方法,所以直接编译报错——连进入运行期的资格都没有,更别说让运行时去识别实际对象类型了。动态绑定的前提是编译通过
当父类和子类的greet()都是public时,编译器检查A类有可访问的greet()方法,编译顺利通过;到运行阶段,才会根据变量实际指向的对象类型(B),动态调用子类的重写方法。这就是多态的核心,但这个机制的前提是编译期能找到合法的方法调用路径。私有方法不存在“重写”关系
子类B的greet()和父类A的greet()只是碰巧同名的两个完全独立的方法——因为私有方法不会被子类继承,子类根本不知道父类有这个方法,所以两者没有任何覆盖/重写关联。编译器也不会把它们当成同一个方法来看待,自然不会在父类引用上尝试去调用子类的这个方法。
内容的提问来源于stack exchange,提问作者Mario Mateaș
相关产品推荐
相关产品推荐

