抽象类必须用abstract修饰且不可实例化,因其含未实现的抽象方法,JVM通过ACC_ABSTRACT标志位检查并拒绝创建对象,确保多态安全与子类强制实现。

因为抽象方法没有具体实现,而JVM在调用方法时必须能定位到确定的字节码指令。如果允许普通类声明抽象方法,就会出现“能被调用却无法执行”的逻辑矛盾——所以Java语言强制要求:只要类中有一个抽象方法,这个类就必须用abstract修饰,且JVM在加载时会检查ACC_ABSTRACT标志位,拒绝实例化。
抽象方法意味着行为未定义
抽象方法只有声明(比如abstract void draw();),没有{}里的实现体。它表达的是“子类必须提供这个功能”,而不是“当前类已经实现了它”。JVM无法为没有方法体的方法生成有效调用链,一旦尝试调用,运行时将无从响应。
abstract是编译期的强制契约
- 若类含抽象方法但没加abstract,编译器直接报错,不生成
.class文件 - 若类被abstract修饰,编译器就允许其中存在无实现的方法,并禁止
new该类 - JVM在类加载阶段读取标志位,发现
ACC_ABSTRACT就拦截new操作
不实例化是保障多态安全的前提
抽象类的设计目标不是创建对象,而是作为类型规范:
- 支持向上转型,如
Shape s = new Circle(); - 确保所有子类覆盖抽象方法,调用时不会因缺失实现而崩溃
- 如果允许直接实例化,就可能出现一个“声明了
draw()却根本画不出任何东西”的对象,破坏多态可靠性
和接口的约束本质一致
接口中的方法默认抽象,同样不能实例化。这说明核心限制不在关键字本身,而在于“行为未完全定义的类型不能独立存在”。abstract对类而言,就是显式声明“我还不完整,请继承我并补全”的唯一合法方式。

















