Java子类扩展为何调用父类私有方法?代码示例答疑
为什么这段Java代码输出"Bird is flying"?
先来看这段代码:
public abstract class Bird { private void fly() { System.out.println("Bird is flying"); } public static void main(String[] args) { Bird bird = new Pelican(); bird.fly(); } } class Pelican extends Bird { protected void fly() { System.out.println("Pelican is flying"); } }
咱们来一步步拆解背后的逻辑:
- 私有方法不会被继承:父类
Bird里的fly()是private修饰的,在Java规则里,私有成员完全属于定义它的类,子类Pelican根本继承不到这个方法。所以Pelican里的fly()是一个全新的方法,和父类的fly()没有任何重写关系。 - 私有方法是静态绑定的:Java对私有方法、静态方法、final方法这类特殊方法,会在编译阶段就确定要调用的方法,而非运行时根据对象实际类型动态绑定。哪怕你用父类引用指向子类对象(
Bird bird = new Pelican()),调用bird.fly()的时候,编译期就已经锁定了父类Bird的私有fly()方法,和子类Pelican的fly()完全无关。
所以运行这段代码时,最终执行的是Bird类里的私有fly()方法,输出Bird is flying。
内容的提问来源于stack exchange,提问作者Ivan Karotki
相关产品推荐
相关产品推荐

