抽象类中可定义非抽象方法,写法同普通类方法,需有方法体、返回类型、方法名和参数列表,支持public/protected/private修饰符,可访问成员变量并被子类继承或重写。

可以。Java 抽象类中定义非抽象方法非常直接:写法和普通类里的具体方法完全一样,不需要加 abstract 关键字,必须提供方法体(即用大括号 {} 包裹实现逻辑)。
基本写法与要求
非抽象方法在抽象类中就是“有完整实现的方法”,它和抽象方法共存于同一个类中,互不冲突。
- 方法声明前不能加
abstract,否则就变成抽象方法了 - 必须有返回类型(包括
void)、方法名、参数列表和方法体 - 可使用任意访问修饰符:
public、protected或private - 可以访问抽象类的成员变量、调用其他非抽象方法,也能被子类继承或重写
常见示例代码
下面是一个合法且典型的写法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
abstract class Vehicle {
protected String brand;
// 非抽象方法:有具体实现,子类可直接调用
public void start() {
System.out.println(brand + " vehicle is starting...");
}
// 非抽象方法:private,仅本类可用
private void checkEngine() {
System.out.println("Engine checked.");
}
// 非抽象方法:final,禁止子类重写
public final void honk() {
System.out.println("Beep beep!");
}
// 抽象方法:子类必须实现
public abstract void drive();
}
为什么能这么写?关键点说明
抽象类的本质是“不完整的类”,但它仍是完整的语法单元,支持类的所有常规能力:
- 它允许包含字段、构造器、静态方法、实例方法——非抽象方法属于后者
- 它的抽象性只体现在“不能被 new 出来”和“可能含未实现方法”,不影响已有方法的定义自由度
- 子类继承后,默认继承所有非
private的非抽象方法;若想改变行为,可用@Override重写
和接口 default 方法的区别
虽然 Java 8+ 接口也支持 default 方法,但抽象类中的非抽象方法更底层、更灵活:
- 可以是
private或protected,接口的default方法只能是public - 能直接访问抽象类的实例变量(比如上面的
brand),而接口无法持有实例状态 - 可参与构造过程(通过
super()调用),为初始化共享逻辑提供基础
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










