抽象类中可定义具体方法,即有方法体且不加abstract关键字的方法,子类可直接调用或重写;其访问权限可为public、protected或默认,但不可为private;常用于封装通用逻辑,如sleep()和breathe()。

抽象类中可以像普通类一样定义具体方法(即有方法体的方法),子类继承后可直接调用或复用,无需重写。
在抽象类中声明具体方法
只要不加 abstract 关键字,且提供方法体(用花括号 {} 实现),该方法就是具体方法。它可被子类直接继承使用。
- 方法可以是 public、protected 或包访问权限(默认),但不能是 private(否则子类无法访问)
- 可被子类直接调用,也可被子类选择性地 @Override 重写
- 常用于封装通用逻辑,比如工具性操作、公共校验、模板步骤等
典型使用场景举例
比如一个抽象动物类,定义通用行为:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
abstract class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
// 抽象方法:子类必须实现
public abstract void makeSound();
// 具体方法:所有子类都能直接复用
public void sleep() {
System.out.println(name + " 正在睡觉...");
}
// 另一个具体方法:含基础逻辑
public final void breathe() {
System.out.println(name + " 正在呼吸(所有动物都这样)");
}
}
子类如 Dog 或 Cat 继承后,可直接调用 sleep() 和 breathe(),无需额外代码。
注意访问控制与设计意图
合理控制方法可见性,能提升复用性和安全性:
- 用 protected 适合只供子类调用的内部逻辑
- 用 public 适合对外暴露的通用能力(如
toString()的增强版) - 加 final 可防止子类覆盖,确保行为一致性(如上面的
breathe()) - 避免在具体方法中依赖未实现的抽象方法,否则运行时可能出错
和接口默认方法的区别
Java 8+ 接口中可用 default 方法提供默认实现,但抽象类的具体方法更灵活:
- 可访问抽象类的成员变量(如
name) - 可调用其他具体方法或抽象方法(只要子类已实现)
- 支持构造器、初始化块等,更适合构建有状态的继承体系
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










