1. 主页 > 好文章

Java子类调用父类方法的3种方式实例


??为什么子类需要调用父类方法???
在面向对象编程中,子类继承父类时可能需要对父类方法进行扩展或复用原有逻辑。例如在重写方法时保留父类核心功能,或在特定场景中强制使用父类实现。以下通过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关键字调用??应作为首选方案,既能保证代码可读性,又符合面向对象设计原则。反射方案仅建议在框架开发等特殊场景使用,而模板方法模式则是构建可扩展系统的利器。实际开发中常见误区是过度使用反射,导致系统像用胶水粘合的积木——看似灵活,实则暗藏崩溃风险。

本文由嘻道妙招独家原创,未经允许,严禁转载