抽象类中可定义普通属性和非抽象方法,语法与普通类一致;普通属性支持各种访问修饰符及static、final修饰,非抽象方法需有方法体且不可为abstract或private。

Java 抽象类中定义普通属性和非抽象方法,和普通类几乎完全一样,没有任何语法限制——只要不违反 abstract 和 final、static、private 等关键字的使用规则即可。
普通属性怎么定义
抽象类中的普通属性(成员变量)可按常规方式声明,支持任意访问修饰符(public、protected、默认包级、private),也可加 static 或 final 修饰:
- 可以是实例变量(如 String name;、int age;)
- 可以是静态变量(如 public static final String VERSION = "1.0";)
- 可以是私有变量(如 private double salary;),子类不可直接访问,但可通过 getter/setter 使用
非抽象方法怎么定义
非抽象方法就是有完整方法体(即带 {} 和具体逻辑)的普通方法,抽象类中可自由定义:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 必须有访问修饰符(public、protected 或默认),不能用 private 修饰抽象方法,但 private 方法在抽象类中是允许的(只是不能被子类继承)
- 可以是实例方法(如 void eat() { System.out.println("Eating..."); })
- 可以是静态方法(如 public static void log(String msg) { ... }),静态方法属于类本身,不参与多态
- 可以有返回值,也可以是 void;可以带参数,也可以无参
需要注意的关键点
虽然写法自由,但以下规则必须遵守:
- abstract 不能修饰属性:Java 不允许 abstract int x; 这样的写法,属性永远是具体的
- abstract 和 static 不能共存于方法:因为 static 方法属于类,而 abstract 方法要求子类重写,二者语义冲突
- abstract 方法不能是 private:private 方法子类不可见,无法重写,违背抽象方法的设计目的
- 抽象类的构造方法可以存在,用于初始化普通属性,但只能被子类构造器通过 super() 调用,不能直接 new
一个典型示例
下面是一个含普通属性、静态变量、私有属性、非抽象方法、静态方法和抽象方法的抽象类:
abstract class Vehicle {
// 普通实例属性
protected String brand;
private int year;
// 静态常量和静态变量
public static final double PI = 3.14159;
protected static int totalCreated = 0;
// 构造方法(用于初始化普通属性)
public Vehicle(String brand, int year) {
this.brand = brand;
this.year = year;
totalCreated++;
}
// 非抽象实例方法(可被子类直接继承调用)
public void start() {
System.out.println(brand + " is starting.");
}
// 非抽象静态方法
public static void showTotal() {
System.out.println("Total vehicles created: " + totalCreated);
}
// 私有方法(仅本类可用)
private void checkEngine() {
System.out.println("Engine checked.");
}
// 抽象方法(强制子类实现)
public abstract void run();
}
子类继承时,可直接使用 brand、调用 start() 和 showTotal(),但必须实现 run()。不复杂但容易忽略细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










