JAVA中的抽象类和抽象方法
在面向对象编程中,“抽象”代表着对事物共性的提取。很多时候,一个父类定义了通用的行为规范,但部分行为并不能直接确定,需要交由子类去实现。为此,Java 提供了 抽象类(abstract class) 和 抽象方法(abstract method) 机制,用于在类层次结构中建立标准与约束。
1.抽象类(Abstract Class)
1.1 定义
抽象类是使用 abstract
关键字修饰的类,它 不能被直接实例化。
它通常用来作为父类,为子类提供统一的设计规范和部分默认实现。
public abstract class 抽象类名{}
1.2 特点
-
不能实例化:
new Employee()
会报错。 -
可以包含:
- 成员变量
- 普通方法(已实现)
- 抽象方法(未实现)
- 构造方法(供子类调用)
-
继承要求:子类必须实现抽象类中的所有抽象方法,否则子类也必须声明为抽象类。
// 抽象类:定义了所有员工的基本行为和数据
public abstract class Employee {private String name;// 构造函数,用于子类初始化父类成员public Employee(String name) {this.name = name;}// 具体方法:所有员工都能执行public void displayInfo() {System.out.println("Employee Name: " + this.name);}// 抽象方法(见下文):薪水的计算方式必须由具体的子类定义public abstract double calculateSalary();
}
2. 抽象方法(Abstract Method)
2.1 定义
抽象方法是用 abstract
关键字修饰的方法,只有方法声明,没有方法体。其目的在于强制子类提供该方法的具体实现。
public abstact 返回值类型 方法名(参数列表);
2.2 子类实现
当一个类继承了包含抽象方法的抽象类,必须重写该抽象方法:
public abstract class Shape {// 抽象方法public abstract double area();
}
public class Circle extends Shape {private double radius;public Circle(double radius) {this.radius = radius;}@Overridepublic double area() {return Math.PI * radius * radius;}
}
2.3 注意事项
-
抽象类中可以没有抽象方法,但如果有抽象方法,该类必须声明为抽象类。
-
抽象类可以有构造方法,主要用于子类初始化时调用。
-
抽象方法不能使用 static、final、private 修饰(因为它们和多态特性冲突)。
private 阻止子类访问和实现。static 意味着方法属于类本身而非对象,与抽象方法的“待实现”性质冲突。final 阻止子类重写方法,与抽象方法的“必须实现”性质冲突。
-
一个类只能单继承一个抽象类,但可以实现多个接口(抽象类和接口结合使用更灵活)。