Java抽象类 #
一、抽象类概述 #
抽象类是用abstract修饰的类,不能被实例化,用于定义子类的通用模板。
1.1 抽象类特点 #
- 不能实例化
- 可以有抽象方法和具体方法
- 可以有构造方法
- 可以有成员变量
1.2 基本语法 #
java
public abstract class Animal {
protected String name;
// 构造方法
public Animal(String name) {
this.name = name;
}
// 抽象方法:没有方法体
public abstract void eat();
// 具体方法
public void sleep() {
System.out.println(name + "在睡觉");
}
}
二、抽象方法 #
2.1 定义 #
抽象方法只有声明,没有实现,由子类实现。
java
public abstract class Shape {
// 抽象方法
public abstract double getArea();
public abstract double getPerimeter();
}
2.2 实现抽象方法 #
java
public class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
@Override
public double getPerimeter() {
return 2 * Math.PI * radius;
}
}
2.3 抽象方法规则 #
- 只有抽象类可以包含抽象方法
- 抽象方法不能是private、static、final
- 子类必须实现所有抽象方法,否则也是抽象类
java
public abstract class Parent {
public abstract void method1();
public abstract void method2();
}
// 必须实现所有抽象方法
public class Child extends Parent {
@Override
public void method1() { }
@Override
public void method2() { }
}
// 或者子类也是抽象类
public abstract class Child2 extends Parent {
@Override
public void method1() { }
// method2仍未实现
}
三、抽象类特点 #
3.1 不能实例化 #
java
public abstract class Animal {
}
// 错误:抽象类不能实例化
// Animal a = new Animal();
// 正确:创建子类对象
Animal a = new Dog();
3.2 可以有构造方法 #
java
public abstract class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name); // 调用父类构造
}
}
3.3 可以有成员变量 #
java
public abstract class Person {
protected String name;
protected int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public abstract void work();
}
3.4 可以有具体方法 #
java
public abstract class Animal {
// 抽象方法
public abstract void eat();
// 具体方法
public void sleep() {
System.out.println("在睡觉");
}
}
四、抽象类vs普通类 #
| 特性 | 抽象类 | 普通类 |
|---|---|---|
| 实例化 | 不能 | 可以 |
| 抽象方法 | 可以有 | 不能有 |
| 继承 | 必须实现抽象方法 | 可选重写 |
| 构造方法 | 可以有 | 可以有 |
五、抽象类vs接口 #
| 特性 | 抽象类 | 接口 |
|---|---|---|
| 继承 | 单继承 | 多实现 |
| 成员变量 | 可以有任意类型 | public static final |
| 构造方法 | 可以有 | 不能有 |
| 方法 | 抽象和具体都可以 | 默认public abstract |
| 设计目的 | 代码复用 | 定义规范 |
六、抽象类应用 #
6.1 模板方法模式 #
java
public abstract class DataProcessor {
// 模板方法
public final void process() {
readData();
processData();
writeData();
}
protected abstract void readData();
protected abstract void processData();
protected abstract void writeData();
}
public class FileProcessor extends DataProcessor {
@Override
protected void readData() {
System.out.println("从文件读取数据");
}
@Override
protected void processData() {
System.out.println("处理数据");
}
@Override
protected void writeData() {
System.out.println("写入文件");
}
}
6.2 图形类层次 #
java
public abstract class Shape {
protected String color;
public Shape(String color) {
this.color = color;
}
public abstract double getArea();
public abstract double getPerimeter();
public void display() {
System.out.println("颜色: " + color);
System.out.println("面积: " + getArea());
System.out.println("周长: " + getPerimeter());
}
}
public class Circle extends Shape {
private double radius;
public Circle(String color, double radius) {
super(color);
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
@Override
public double getPerimeter() {
return 2 * Math.PI * radius;
}
}
6.3 员工管理系统 #
java
public abstract class Employee {
private String name;
private double baseSalary;
public Employee(String name, double baseSalary) {
this.name = name;
this.baseSalary = baseSalary;
}
public abstract double calculateSalary();
public String getName() {
return name;
}
public double getBaseSalary() {
return baseSalary;
}
}
public class Manager extends Employee {
private double bonus;
public Manager(String name, double baseSalary, double bonus) {
super(name, baseSalary);
this.bonus = bonus;
}
@Override
public double calculateSalary() {
return getBaseSalary() + bonus;
}
}
public class Developer extends Employee {
private int overtimeHours;
public Developer(String name, double baseSalary, int overtimeHours) {
super(name, baseSalary);
this.overtimeHours = overtimeHours;
}
@Override
public double calculateSalary() {
return getBaseSalary() + overtimeHours * 100;
}
}
七、总结 #
| 概念 | 说明 |
|---|---|
| abstract class | 抽象类 |
| abstract method | 抽象方法 |
| 不能实例化 | 抽象类不能创建对象 |
| 必须实现 | 子类必须实现抽象方法 |
抽象类要点:
- 用abstract修饰
- 不能实例化
- 可以有抽象方法和具体方法
- 子类必须实现所有抽象方法
- 用于定义通用模板
最后更新:2026-03-26