抽象类可包含普通方法、成员变量和静态成员,支持继承与复用;普通方法有完整实现,子类可直接调用或选择重写;成员变量按访问修饰符控制可见性;静态成员属于类本身,共享且不可与abstract共存。

可以,抽象类中完全可以包含普通方法和成员变量,而且这是它区别于接口的重要优势之一。
普通方法在抽象类中的作用与处理方式
抽象类里的普通方法(也叫具体方法)带有完整的方法体,子类可以直接继承并调用,无需重写。这类方法常用于封装通用逻辑,比如日志打印、参数校验、基础状态设置等。
- 子类通过
super.方法名()可显式调用父类普通方法 - 如果子类需要扩展行为,可以重写该方法,但不是强制要求
- 可用
final修饰防止被子类覆盖,适合关键流程控制(如模板方法中的钩子)
成员变量的定义与访问规则
抽象类支持任意访问修饰符的成员变量:private、protected、public 或包级私有。这些变量会被子类继承,并按权限决定是否可直接访问。
-
protected变量最常用——子类可直接使用,外部类不可见 -
private变量仅限抽象类内部使用,子类需通过protected或public的 getter/setter 访问 - 构造方法中通常用来初始化这些变量,虽然抽象类不能实例化,但子类构造时会自动调用父类构造器
静态成员也能放进去
抽象类还支持static变量和方法,它们属于类本身,不依赖实例。例如版本号、计数器、工具函数等都适合放在这里。
- 静态变量所有子类共享,注意多线程下的并发安全
- 静态方法不能访问非静态成员,也不能使用
this或super -
abstract和static不能同时修饰一个方法——语义冲突,编译报错
实际写法示例
以下是一个典型结构:
abstract class Vehicle {
protected String brand; // 成员变量(protected,子类可直接用)
private int wheelCount = 4; // 私有变量,需通过方法暴露
public static final String TYPE = "Transport"; // 静态常量
protected Vehicle(String brand) { // 构造方法,供子类调用
this.brand = brand;
}
public void start() { // 普通方法,子类可直接调用
System.out.println(brand + " engine started.");
}
public static void logInfo() { // 静态方法,类名直接调用
System.out.println("Vehicle base info");
}
public abstract void drive(); // 抽象方法,子类必须实现
}










