子类对象调用父类私有方法问题:访问修饰符为何影响方法调用?
为什么父类方法的访问修饰符会影响方法调用逻辑?
这其实是Java里方法重写和访问控制结合的核心知识点,咱们一步步把它讲透:
1. 私有方法的本质:无法被重写,完全隐藏
当父类的getBankName()是private修饰时,这个方法是父类的私有成员——它对子类完全不可见,子类根本没法“重写”它。你在子类里写的public void getBankName(),本质上是一个和父类方法同名但毫无关系的全新方法,两者不存在重写关联。
这时候看代码里的调用逻辑:
Bank bank = new MyBank(); bank.getBankName();
编译器在编译阶段,只会检查引用类型(Bank)里有没有getBankName()方法——因为父类的私有方法在编译时就被绑定到了父类自身,不会触发Java的动态绑定机制。所以运行时,不管实际对象是MyBank还是啥,都会调用父类的私有getBankName(),输出"Bank"。
2. 改为public后:触发动态绑定的方法重写
当父类方法改成public后,它就满足了方法重写的前提:
- 子类方法和父类方法签名完全一致
- 子类方法的访问修饰符(
public)比父类的(public)更宽松或相同
这时候,子类的getBankName()就是真正的重写方法了。Java的动态绑定机制会在运行时生效:它会根据实际创建的对象类型(MyBank),去调用子类重写后的方法,所以输出"MyBank"。
一个快速验证小技巧
你可以试试在子类的getBankName()上加上@Override注解:
- 如果父类方法是
private,编译器会直接报错,说明这不是合法的重写; - 改成
public后,注解会被正常识别,证明这是标准的方法重写。
内容的提问来源于stack exchange,提问作者hitesh
相关产品推荐
相关产品推荐

