使用抽象类的核心目的,是为了把“公共的、必须存在的东西”抽象出来,同时强制子类去完成某些具体实现。它介于“接口”和“普通类”之间,解决的是代码复用 + 规范约束的问题。
下面从为什么要用、适合什么场景、和接口的区别几个角度说明。
如果多个子类有相同的字段或方法实现,可以把它们放到抽象类中。
abstract class Animal {
String name;
void sleep() {
System.out.println("睡觉");
}
abstract void makeSound();
}
子类只需要关心不同的部分:
class Dog extends Animal {
void makeSound() {
System.out.println("汪汪");
}
}
✅ 好处:
抽象类可以定义抽象方法,子类必须实现,否则编译不过。
abstract class Shape {
abstract double area();
}
class Circle extends Shape {
double area() {
return Math.PI * r * r;
}
}
✅ 好处:
抽象类表达的是一种类型的层次关系:
Animal
├── Dog
├── Cat
比接口更强调本质归属。
抽象类非常适合定义流程骨架,把可变部分留给子类。
abstract class OrderProcessor {
void process() {
check();
pay();
afterSale();
}
abstract void pay();
}
子类只关心支付差异,流程不可乱改。
✅ 好处:
抽象类可以:
接口一旦发布,加方法会破坏实现类。
✅ 适合用抽象类的情况:
✅ 一句话总结:
有公共实现、有继承关系、需要约束子类 → 用抽象类
| 对比点 | 抽象类 | 接口 |
|---|---|---|
| 是否有状态 | ✅ 可以有 | ❌ 一般没有 |
| 是否有方法实现 | ✅ 可以 | ✅(Java 8+) |
| 是否强调继承 | ✅ is-a | ✅ can-do |
| 能否多继承 | ❌ 单继承 | ✅ 多实现 |
| 演进成本 | 低 | 高 |
抽象类用于表达一类事物的共性,既可以复用代码,又可以约束子类行为;接口更偏向能力定义,抽象类更偏向类型与实现。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。