在进行软件开发的过程中,抽象类和接口是两个非常有用的工具,能够帮助我们设计更加可维护、安全和高效的程序。
抽象类
抽象类是一个不能被实例化的类,它只提供了一些公共行为,并且定义了子类必须实现的一些方法。因此,抽象类通常被用来作为其他类的基类,为它们提供统一的接口,并强制执行一些通用的行为。
特点
抽象类不能直接实例化,抽象类如何实例化呢?
参照多态的方式,通过子类对象实例化,称为抽象类多态。
抽象类可以被继承,子类要么重写抽象类中的所有抽象方法要么也定义为抽象类。
成员
1、成员变量可以是常量也可以是变量。
2、构造方法可以是有参也可以是无参。
3、成员方法可以是抽象方法也可以是普通方法,但至少要有一个抽象方法。
案例分析
定义一个抽象的 Shape 类,其中包括一个计算面积的抽象方法。然后,可以从 Shape 中找出具体子类,如 Circle 和 Rectangle 类,这些类必须实现其自己的计算面积方法。
abstract class Shape {
public abstract double area();
}
class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height;
}
}
在案例中,抽象 Shape 类提供了一个通用的方法 area(),Circle 和 Rectangle 类则实现自己的版本。由于所有的 Shape 的子类都必须包含 area() 方法,因此保证了程序符合某种规范或标准。
接口
接口可以看作是一组方法声明的集合,这些方法不包含任何实现。
是一种公共的规范标准,只要符合规范标准,大家都可以通用。
特点
接口也不能实直接例化,需要参照多态的方式,通过实现类对象实例化,也称接口多态。
实现类要么重写接口中所有的抽象方法,要么定义为抽象类。
成员
1、成员变量只能是常量,默认修饰符public static final。
2、不存在构造方法,因为接口是拓展功能的,没有具体存在。
3、成员方法只能使抽象方法,默认修饰符public abstract(JDK8之前都没有方法体,JDK8提供了默认方法和静态方法功能,,JDK9开始接口里可以定义带方法体的私有方法)
案例分析
假设现在需要基于订单处理的系统,设计一个 PaymentProcessor 接口,其中包括一个 processPayment() 方法,用于处理付款。可以将该接口应用于多种类型的实现类,例如 CreditCardProcessor 或 PayPalProcessor 等:
interface PaymentProcessor {
boolean processPayment(double amount);
}
class CreditCardProcessor implements PaymentProcessor {
public boolean processPayment(double amount) {
return true; // 处理信用卡付款逻辑
}
}
class PayPalProcessor implements PaymentProcessor {
public boolean processPayment(double amount) {
return true; // 处理 PayPal 付款逻辑
}
}
在案例中,我们定义了一个 PaymentProcessor 接口,编写 processPayment() 方法,不给具体实现方法体。之后创建两个实现类 CreditCardProcessor 和 PayPalProcessor,它们分别利用该接口实现了自己的逻辑。如果需要新增一种支付方式,我们只需再添加一个新的实现类即可,不需要更改系统整体的代码结构。
小结
抽象类和接口都是在软件开发常用的东西,能够帮助我们设计出更好的程序架构。
在实际开发中,经常被用于定义简单但具有可扩展性的 API,并且可以通过将其用作应用程序中的标准来更加容易地维护整个代码库。