public abstract class Device { public void powerOn() { System.out.println("设备已通电"); } public abstract void operate(); }

直接写一个带抽象方法和普通方法的抽象类,关键就两点:用 abstract 修饰类名,再在类里混着写抽象方法(无大括号、无实现)和普通方法(有完整方法体)。
语法结构要规范
必须用 abstract class 类名 声明,不能省略 abstract;抽象方法前也要加 abstract,且不能有方法体,结尾是分号;普通方法按常规写法,有返回类型、参数列表和花括号包裹的逻辑。
- 错误示范:
public void work() {}写在抽象类里没问题,但若漏掉 abstract 修饰类名,编译器会报错“非抽象类不能包含抽象方法” - 正确写法示例:
public abstract class Device { // 普通方法:可直接调用 public void powerOn() { System.out.println("设备已通电"); } // 抽象方法:强制子类实现 public abstract void operate(); }
成员可以多样化
抽象类不是“只有抽象方法”的空壳。它支持构造方法、成员变量、静态方法、普通方法、抽象方法共存,和普通类一样具备完整类结构,只是不能 new 出实例。
- 构造方法可用,供子类通过 super() 调用,初始化父类字段
- 成员变量可以是 private/protected/public,也能定义 static final 常量
- 静态方法可以直接通过类名调用,不依赖实例
- 普通方法能被子类继承使用,也可选择重写
子类继承时的硬性要求
一旦具体类(非 abstract)继承该抽象类,就必须覆盖所有抽象方法;否则编译失败。普通方法则无需重写,直接继承即可使用。
- 比如继承上面的 Device,必须实现 operate(),但 powerOn() 可以直接 robot.powerOn() 调用
- 如果子类不想立即实现抽象方法,可声明为 abstract class Robot extends Device,把实现责任留给更下层子类
别踩这些常见坑
抽象方法有严格修饰限制,和某些关键字天然冲突:
- 不能用 private 修饰抽象方法——子类根本访问不到,无法重写
- 不能用 final 或 static——final 禁止重写,static 属于类而非实例,违背抽象方法设计本意
- 抽象类本身可以没有抽象方法(极少用),但只要含抽象方法,类就必须声明为 abstract

















