抽象类可以包含构造方法和非抽象方法,子类实例化时调用其构造方法初始化继承成员,非抽象方法可直接继承复用,支持模板方法模式,区别于接口的关键在于支持构造器、实例变量及单继承语义。

可以,抽象类中既能包含普通方法(有具体实现的方法),也能包含构造方法。这不是“能不能”的问题,而是 Java 语言明确允许的特性。
抽象类里可以写普通方法
普通方法就是带方法体(即有 {} 和具体逻辑)的方法。抽象类中定义普通方法,子类可以直接继承并调用,无需重写。
- 例如:
abstract class Animal { void breathe() { System.out.println("呼吸"); } } -
Dog extends Animal创建对象后,可直接调用dog.breathe() - 这个方法对所有子类通用,避免重复编写,体现代码复用
抽象类里可以写构造方法
抽象类不能被 new 实例化,但它的构造方法不是摆设——它会在子类实例化时被自动调用(通过 super()),用于初始化父类中的成员变量。
- 例如:
abstract class Animal { protected String name; public Animal(String name) { this.name = name; } } - 子类构造器第一行默认或显式调用
super(name),否则编译报错 - 若不写构造方法,编译器会提供无参默认构造器;一旦自定义了构造器,无参构造器就不再自动生成
怎么验证这两点
最直接的方式是写一段可运行的代码,在 IDE 中编译执行,观察是否报错、能否调用、输出是否符合预期。
- 新建抽象类,里面加一个普通方法(如
void info(){...})和一个带参构造器 - 写一个非抽象子类,继承它,并在子类构造器中调用
super(...) - 在子类中不重写普通方法,直接在
main中创建子类对象,调用该普通方法 - 运行后看到输出,说明普通方法被成功继承调用;控制台打印构造器日志,说明构造器被执行
注意几个关键限制
避免踩坑,得清楚边界:
- 抽象类不能用
new直接创建对象,哪怕它只有构造器、没有抽象方法 - 构造方法不能是
abstract或static或private(private会导致子类无法调用) - 抽象方法不能是
static、private、final—— 因为它们违背“强制子类实现”的设计意图 - 普通方法和构造方法的存在,不改变抽象类“必须被继承才能使用”的本质
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











