抽象类用于定义模板和强制子类实现,须用abstract声明;含抽象方法或本身被abstract修饰则不可实例化;子类必须实现所有抽象方法或声明为abstract;与接口相比,抽象类支持构造器、成员变量和普通方法,适用于is-a关系和状态共享。

抽象类不是用来直接创建对象的,而是为子类提供统一模板和强制约束。
抽象类必须用 abstract 关键字声明
Java 要求只要类中包含至少一个抽象方法(没有方法体的方法),这个类就必须被声明为 abstract;反过来,即使类里没有抽象方法,也可以用 abstract 声明——这种类不能被实例化,只用于被继承。
-
abstract类可以有构造方法,但只能被子类调用(通过super()),不能直接new - 抽象方法不能是
private、static或final——否则违背“强制子类实现”的设计意图 - 抽象类可以包含普通方法、字段、静态块、构造器,甚至
main方法(可运行,但不能 new 实例)
子类继承抽象类必须实现所有抽象方法
除非子类自己也声明为 abstract。这是编译器强制检查的,不满足会报错:error: class X must either be declared abstract or implement abstract method Y in Z。
- 实现时方法签名(名称、参数、返回类型)必须完全一致,访问修饰符不能比父类更严格(比如父类是
protected,子类不能写private) - 抽象类的抽象方法可以被
public、protected修饰,但不能是包私有(缺省)+ 子类在不同包时无法访问,导致无法实现 - 如果父类抽象方法是
public,子类实现时最好也显式写public,避免因默认包访问权限引发意外编译失败
抽象类 vs 接口:关键区别在设计意图和能力边界
抽象类强调“是什么”(is-a 关系),接口强调“能做什么”(can-do)。Java 8 后接口也能有默认方法和静态方法,但仍有不可逾越的限制:
立即学习“Java免费学习笔记(深入)”;
- 抽象类支持构造器、成员变量(可非
final)、普通方法实现;接口只能有public static final字段和public abstract/default/static方法 - 类只能单继承抽象类,但可实现多个接口——这是选择抽象类还是接口的核心权衡点
- 如果需要共享状态(如
protected int count)或复用逻辑(如模板方法模式中的templateMethod()),抽象类更合适
抽象类真正的难点不在语法,而在于判断“什么时候该抽象、抽象到哪一层”。过早抽象会导致子类被强加无关契约,过晚又失去复用价值。实际开发中,先写出两个以上相似子类,再把共性上提到抽象类,往往比一开始就设计抽象类更稳妥。










