为何要使用抽象方法与重写,而非在父类中定义通用方法?
为什么要使用抽象方法与重写,而不是父类通用方法?
这是个特别接地气的问题!很多刚摸面向对象的朋友都会有这个疑惑——既然父类里能写个通用方法凑合用,为啥还要费劲儿搞抽象方法和重写这套?咱们就拿你给的代码例子来掰扯清楚。
先看你给出的这个多态实现:
class Demo { public static void main(String[] args) { Parent a = new Child_A(); Parent b = new Child_B(); a.method(); // 执行Child_A的method逻辑 b.method(); // 执行Child_B的method逻辑 } } abstract class Parent { abstract void method(); // 抽象方法,没有具体实现 } class Child_A extends Parent { @Override void method() { // 执行Child_A专属的任务逻辑 } } class Child_B extends Parent { @Override void method() { // 执行Child_B专属的任务逻辑 } }
抽象方法的核心价值:强制子类遵守契约
假设咱们不用抽象方法,而是在父类里写一个空的“通用方法”:
class Parent { void method() { // 空实现或者随便写点通用逻辑 } }
这时候子类可以选择重写method(),也可以不重写。但问题来了:
- 如果某个子类(比如后来加的
Child_C)忘记重写method(),调用的时候就会跑父类的空实现,这很容易引发隐性bug,而且编译器根本不会提醒你哪里错了。 - 抽象方法的作用就是给子类立规矩:你继承我这个父类,就必须实现
method()方法,不然连编译都过不了。相当于提前把“必须做的事”给明确下来,从根源上避免漏写关键逻辑。
再说说重写+多态的灵活性
用抽象父类定义统一的方法签名,子类各自实现具体逻辑,再通过父类引用来调用方法——这就是多态的精髓。后续如果要加新的子类(比如Child_C、Child_D),只需要继承Parent并实现method()就行,原有调用代码(比如Demo里的逻辑)完全不用改,扩展性拉满。
要是用父类通用方法,不仅没法强制子类实现,代码可读性也差:别人看父类的空方法,根本不知道子类到底应该实现什么逻辑,维护起来成本极高。
总结一下,抽象方法+重写不是没事找事,而是为了:
- 强制子类遵守行为契约,避免隐性bug
- 实现多态,让代码更灵活、易扩展
- 让类体系的职责更清晰,可读性更强
内容的提问来源于stack exchange,提问作者Peng
相关产品推荐
相关产品推荐

