在 Java 中,抽象类(abstract class)用于抽取一组相关类的公共行为和属性,同时保留让子类去实现具体细节的能力。下面从设计原则、语法要点、常见结构、示例和注意事项几个方面说明如何设计 Java 抽象类。
public abstract class Animal {
// 普通属性
protected String name;
// 构造方法
public Animal(String name) {
this.name = name;
}
// 普通方法
public void sleep() {
System.out.println(name + " is sleeping");
}
// 抽象方法(无方法体)
public abstract void makeSound();
}
要点:
abstract 修饰类抽象类应表示一类事物的共同特征。
✅ 适合抽象类:
❌ 不适合:
interface 或 final class)抽象类非常适合模板方法模式:
public abstract class Game {
public final void play() {
start();
run();
end();
}
abstract void start();
abstract void run();
abstract void end();
}
子类只需关注变化点,流程由父类控制。
public abstract class Logger {
public abstract void log(String msg);
public void logError(String msg) {
log("[ERROR] " + msg);
}
}
public abstract class Shape {
protected String color;
public Shape(String color) {
this.color = color;
}
}
| 特性 | 抽象类 | 接口 |
|---|---|---|
| 是否有状态 | ✅ 可以有字段 | ❌ 只能常量 |
| 构造方法 | ✅ 有 | ❌ 无 |
| 方法实现 | ✅ 可部分实现 | ✅(Java 8+ default) |
| 继承关系 | 单继承 | 多实现 |
| 设计目的 | “是什么” | “能做什么” |
经验法则:
public abstract class Employee {
protected String name;
protected double salary;
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
public void work() {
System.out.println(name + " is working");
}
public abstract double calculateBonus();
}
public class Manager extends Employee {
public Manager(String name, double salary) {
super(name, salary);
}
@Override
public double calculateBonus() {
return salary * 0.2;
}
}
❌ 抽象类里全是抽象方法(应直接用接口)
❌ 抽象类承担过多职责(违反单一职责)
❌ 频繁修改抽象类(影响所有子类)
❌ 把“工具类”写成抽象类
如果你有具体业务场景(如订单系统、支付系统、游戏等),我可以帮你设计一个更贴合的抽象类结构。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。