Java 抽象类
在 Java 中,抽象类(Abstract Class)是一种特殊的类,它不能被直接实例化,主要用于作为其他类的基类(父类),封装子类的共性特征并定义必须实现的规范。
一、抽象类的定义
抽象类通过 abstract 关键字修饰,语法格式如下:
abstract class 类名 {
// 成员变量
// 普通方法(有方法体)
// 抽象方法(无方法体,用abstract修饰)
}
二、抽象类的核心特点
不能实例化抽象类无法通过 new 关键字创建对象,只能作为父类被继承。
可以包含抽象方法抽象方法是没有方法体的方法,用 abstract 修饰,格式为:abstract 返回值类型 方法名(参数列表);抽象方法的作用是定义子类必须实现的规范,子类必须重写父类所有的抽象方法(除非子类也是抽象类)。
可以包含普通成员抽象类可以有普通方法(带方法体)、成员变量、构造方法(供子类调用)等。
单继承限制一个类只能继承一个抽象类(Java 单继承特性),但抽象类可以实现多个接口。
三、抽象类的使用场景
当多个类存在共性特征(属性或方法),但部分行为(方法)无法在父类中具体实现时,可将父类定义为抽象类。
例如:几何图形(圆形、矩形等)都有 “计算面积” 的行为,但具体计算方式不同,可将 “图形” 定义为抽象类,“计算面积” 定义为抽象方法。
四、示例代码
下面通过 “图形计算面积” 的例子展示抽象类的用法:
// 抽象类:图形
abstract class Shape {
// 普通成员变量:颜色
String color;
// 构造方法(供子类调用)
public Shape(String color) {
this.color = color;
}
// 普通方法:获取颜色
public String getColor() {
return color;
}
// 抽象方法:计算面积(子类必须实现)
public abstract double getArea();
}
// 子类:圆形(继承抽象类Shape)
class Circle extends Shape {
double radius; // 半径
public Circle(String color, double radius) {
super(color); // 调用父类构造方法
this.radius = radius;
}
// 必须重写抽象方法getArea()
@Override
public double getArea() {
return Math.PI * radius * radius;
}
}
// 子类:矩形(继承抽象类Shape)
class Rectangle extends Shape {
double length; // 长
double width; // 宽
public Rectangle(String color, double length, double width) {
super(color);
this.length = length;
this.width = width;
}
// 必须重写抽象方法getArea()
@Override
public double getArea() {
return length * width;
}
}
// 测试类
public class Test {
public static void main(String[] args) {
// 抽象类不能实例化,以下代码会报错:
// Shape shape = new Shape("红色");
// 通过子类实例化,并调用方法
Shape circle = new Circle("蓝色", 2.0);
System.out.println("圆形面积:" + circle.getArea()); // 输出:12.566...
Shape rectangle = new Rectangle("红色", 3.0, 4.0);
System.out.println("矩形面积:" + rectangle.getArea()); // 输出:12.0
}
}
五、抽象类 vs 接口
特性抽象类接口(Java 8+)
关键字
abstract class
interface
继承 / 实现方式
单继承(extends)
多实现(implements)
方法类型
可包含抽象方法和普通方法
可包含抽象方法、默认方法、静态方法
成员变量
可包含任意成员变量
只能是常量(public static final)
构造方法
有构造方法(供子类调用)
无构造方法
总结
抽象类是 Java 中实现代码复用和规范定义的重要机制,它通过抽象方法约束子类的行为,同时通过普通方法封装共性逻辑,是实现多态的重要手段。
posted on
2025-09-16 08:47
coding博客
阅读(87)
评论(0)
收藏
举报

