Java抽象类不能被直接实例化,因其本质是待完成的设计契约而非可用对象模板,编译器在语法解析阶段即禁止new操作并报错,JVM加载时还校验ACC_ABSTRACT标志位确保安全性。

Java中抽象类用 abstract class 声明,不能直接实例化,专为被继承设计。
基本语法格式
抽象类的定义以 abstract 关键字开头,类名后跟大括号,内部可包含抽象方法(无方法体)和具体方法(有实现):
-
abstract 必须写在 class 前面,顺序不能颠倒(如不能写成
class abstract) - 抽象方法用 abstract 修饰,末尾只有分号,不写花括号和方法体
- 抽象类中可以有普通字段、构造方法、静态方法、final 方法、非抽象方法等
- 子类继承抽象类,必须实现所有抽象方法,除非子类也声明为 abstract
一个典型例子
比如定义一个图形基类,规定子类必须提供面积计算逻辑:
abstract class Shape {
protected String name;
<pre class="brush:php;toolbar:false;">// 构造方法(抽象类可以有构造器,用于初始化)
public Shape(String name) {
this.name = name;
}
// 抽象方法:子类必须重写
public abstract double getArea();
// 普通方法:抽象类可提供默认实现
public void showInfo() {
System.out.println("图形名称:" + name);
}}
// 具体子类,必须实现 getArea() class Circle extends Shape { private double radius;
public Circle(String name, double radius) {
super(name);
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}}
常见注意事项
- 抽象类不能用 new 创建对象:
new Shape()编译报错 - 抽象方法不能是 private、static 或 final(它们与“被子类重写”冲突)
- 抽象类可以没有抽象方法(但很少见,一般用接口替代)
- 一个类只能继承一个抽象类(Java 单继承),但可同时实现多个接口
和接口的区别要点
- 抽象类支持构造方法、成员变量(各种访问修饰符)、非抽象方法;接口只能有 public static final 字段和 public abstract 方法(Java 8+ 可有 default/static 方法)
- 抽象类体现“是什么”(is-a 关系),接口体现“能做什么”(can-do 关系)
- 抽象类适合共享代码和状态,接口适合定义行为契约
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











