Java子类调用父类方法的3种方式实例
日期:2025-05-27 11:01:37 •原创
??为什么子类需要调用父类方法???
在面向对象编程中,子类继承父类时可能需要对父类方法进行扩展或复用原有逻辑。例如在重写方法时保留父类核心功能,或在特定场景中强制使用父类实现。以下通过3个典型场景展开说明。
方式一:使用super关键字直接调用
??核心代码示例??
java复制class Animal { void eat() { System.out.println("动物进食"); } } class Cat extends Animal { @Override void eat() { **super.eat();** // 先执行父类方法 System.out.println("猫吃鱼"); } }
??关键问答??
什么时候必须用super?
当子类重写父类方法后,若需要复用父类原始逻辑时,必须通过??super.methodName()??显式调用。否则父类方法会被完全覆盖。
??优势对比??
- 最直接的调用方式
- 代码可读性强
- 编译时检查方法是否存在
方式二:通过反射机制调用
??强制访问父类私有方法示例??
java复制class Parent { private void secret() { System.out.println("父类私有方法"); } } class Child extends Parent { void callSecret() throws Exception { Method method = **Parent.class.getDeclaredMethod("secret");** method.setAccessible(true); **method.invoke(this);** // 反射调用 } }
??技术难点??
反射能否突破访问限制?
通过??getDeclaredMethod()??和??setAccessible(true)??的组合,可以强制调用父类私有方法,但会破坏封装性,需谨慎使用。
??风险提示??
- 性能损耗比直接调用高约50倍
- 可能引发SecurityException异常
- 代码维护难度增加
方式三:方法重写时保留父类逻辑
??模板方法模式应用??
java复制class Payment { **final void process()** { // 禁止子类重写流程 checkBalance(); deduct(); logResult(); } void deduct() { System.out.println("基础扣款逻辑"); } } class CreditPayment extends Payment { @Override void deduct() { **super.deduct();** // 保留父类核心逻辑 System.out.println("增加信用额度验证"); } }
??设计原则??
为什么用final限制流程?
通过??final??关键字锁定父类方法结构,确保子类只能扩展特定环节(如deduct()方法),这是模板方法模式的典型应用。
??实战建议??
- 支付系统常用此模式保证交易流程安全
- 日志记录等通用操作适合放在父类
- 子类扩展点控制在业务变化频繁的环节
从工程实践角度看,??super关键字调用??应作为首选方案,既能保证代码可读性,又符合面向对象设计原则。反射方案仅建议在框架开发等特殊场景使用,而模板方法模式则是构建可扩展系统的利器。实际开发中常见误区是过度使用反射,导致系统像用胶水粘合的积木——看似灵活,实则暗藏崩溃风险。
本文由嘻道妙招独家原创,未经允许,严禁转载