抽象类必须用abstract修饰且不可实例化,因其含未实现的抽象方法,jvm需确定执行逻辑;abstract是编译期强制契约,确保子类重写并保障多态安全。

因为抽象方法没有具体实现,而 JVM 要求每个可调用的方法都必须有确定的执行逻辑。如果允许普通类声明抽象方法,就会出现“能被调用却无法执行”的矛盾;所以 Java 强制规定:只要类中有一个抽象方法,这个类就必须用 abstract 修饰,且禁止通过 new 直接创建实例。
抽象方法的本质是“未定义行为”
抽象方法只有声明(比如 abstract void draw();),没有方法体(即没有 {} 里的实现)。它表达的是“子类必须提供这个功能”,而不是“当前类已经实现了它”。JVM 在加载类、准备调用方法时,需要能定位到具体的字节码指令。没有实现的方法无法生成有效调用链,强行实例化会导致运行时无法响应方法调用。
abstract 是编译期的强制契约
Java 编译器把 abstract 当作一种语义标记,不是可选修饰符:
- 若类含抽象方法但没加 abstract,编译直接报错,不生成 class 文件
- 若类被 abstract 修饰,编译器就允许其中存在无实现的方法,并禁止 new 该类
- JVM 在类加载阶段会检查 ACC_ABSTRACT 标志位,发现后拒绝实例化操作
不实例化是为了保障多态安全
抽象类的设计目标不是创建对象,而是作为类型规范:
- 它允许用父类引用指向不同子类对象(如 Shape s = new Circle();)
- 所有子类必须覆盖抽象方法,确保向上转型后调用不会失败
- 如果允许直接实例化抽象类,就可能产生一个“调用抽象方法却无实际逻辑”的对象,破坏多态的可靠性
常见误区提醒
这些情况容易出错,需特别注意:
- 抽象类可以没有抽象方法,但含抽象方法的类一定得是抽象类
- abstract 和 final 不能共用——前者要求被继承重写,后者禁止继承重写
- abstract 和 static 不能共用——静态方法属于类本身,而抽象方法必须由子类实例来实现
- abstract 方法不能是 private——私有方法无法被子类重写,违背抽象方法的设计目的











