抽象类中应将普遍存在且实现方式各异的行为(如eat、move、makeSound)声明为抽象方法,强制子类实现;而逻辑统一的行为(如logActivity、sleep、getter)可直接实现;共有属性(如name、age)放入抽象类,可选特征宜用接口扩展。

共性行为要从“所有动物都做,但做法不同”中识别
不是所有带“动词”的行为都适合放进抽象类。关键看两点:一是是否普遍存在(比如猫、狗、鸟都会呼吸),二是实现方式是否必然不同(猫用肺、鱼用鳃、昆虫用气管)。满足这两点的,就该声明为抽象方法;如果所有动物做法完全一致(比如“心跳由心脏驱动”这种底层机制不暴露给业务层),才考虑写成普通方法。
把“必须有、但不能统一写死”的行为设为抽象方法
例如进食、移动、发出声音——每个动物都做,但内容千差万别:
- eat():猫吃鱼、牛吃草、鹰吃肉 → 必须由子类各自实现
- move():蛇爬行、鸟飞行、鲸游泳 → 无法用同一段代码表达
- makeSound():狗叫、猫喵、公鸡打鸣 → 行为存在,形式各异
这些方法在抽象类中只写声明,不写花括号,强制子类覆盖:
public abstract void eat();public abstract void move();
public abstract void makeSound();
把“所有动物都做,且做法可统一”的行为写成具体方法
有些行为逻辑稳定、无需子类改动,就直接实现在抽象类里。比如:
立即学习“Java免费学习笔记(深入)”;
- 记录基础状态(如调用
logActivity("进食")统一打日志) - 执行固定流程(如
sleep()先闭眼再进入休眠态,子类只需控制时长) - 提供工具功能(如
getName()或getAge()这类 getter)
这类方法用protected或public修饰,子类可直接继承使用,也可选择重写。
属性抽取要区分“共有”和“可选”
年龄、名称、体重是绝大多数动物都具备的,适合放在抽象类中作为protected成员变量;而像“是否有毒”“是否迁徙”“羽毛颜色”这类特征,只属于部分动物,就不应强塞进抽象类。否则会逼迫蛇类也存一个featherColor字段,既浪费又违背语义。
真正需要扩展的特性,更适合通过接口(如Poisonous、Migratory)按需添加,而不是靠抽象类硬塞。


















