抽象类不能直接创建对象,但可被继承;子类若非抽象类,必须实现所有抽象方法才能实例化,否则编译失败。

抽象类不能直接创建对象,但可以被继承;子类必须实现所有抽象方法,才能被实例化。这是抽象类在Java进阶中发挥约束与模板作用的关键机制。
抽象类的定义与继承语法
用 abstract 修饰的类即为抽象类,它可包含普通方法和抽象方法(无方法体、用 abstract 修饰)。子类通过 extends 继承抽象类,语法与其他类一致:
- public abstract class Shape {
public abstract double area(); // 抽象方法
public void printInfo() { System.out.println("这是一个图形"); } // 普通方法
} - public class Circle extends Shape {
private double radius;
public Circle(double r) { this.radius = r; }
@Override
public double area() { return 3.14 * radius * radius; } // 必须实现
}
子类继承抽象类的硬性要求
如果子类不是抽象类,就必须覆盖父类中所有的抽象方法。否则编译报错:
- 未实现抽象方法 → 编译失败:“Circle is not abstract and does not override abstract method area()”
- 子类也声明为 abstract → 可不实现抽象方法,但该子类仍不可实例化
- 抽象方法的访问权限不能比父类更严格(如父类是 public,子类实现也必须是 public)
抽象类中的构造方法与 super 调用
抽象类虽不能 new 实例,但它可以有构造方法,并在子类构造中通过 super() 显式调用:
- 抽象类 Shape(int id) { this.id = id; } // 允许有参构造
- 子类 Circle(int id, double r) { super(id); this.radius = r; } // 必须第一行调用
- 子类对象初始化时,会先执行抽象父类构造逻辑,再执行自身构造逻辑
结合继承与抽象的设计意图
抽象类不是为了“写得更少”,而是为了“约束得更准”:
- 把共性行为(如 printInfo())放在抽象父类中复用
- 把差异行为(如 area()、perimeter())定义为抽象方法,强制子类按统一协议提供具体实现
- 避免出现“能 new 出一个不知道怎么算面积的 Shape 对象”这种语义错误
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











