Java 中的抽象类和接口
抽象类和接口都是分离接口与实现的手段,而 Java 直接在语法上为两者提供了支持,很多其他 OOP 类语言是通过间接的方式实现这种概念的(如C++、python等)。
需要提前说明的一点注意是,无论是抽象类还是接口,都需要依赖继承的方式类完成具体的实现,且通过多态进行灵活应用,所以正如在之前介绍继承和多态时所说的那样,大多数时候,不需要它们工作也能完成,必要时再考虑使用它们。
从功能上来说,抽象类和接口都是对基类的一种抽象,接口比抽象类的抽象程度更高。下面就具体介绍两者的语法机制和一些应用场景。
1. 抽象类
一个类只要包含至少一个 抽象方法(abstract method),那么它就是 抽象类(abstract class)。Java 通过 abstract 关键字定义抽象。抽象方法是 abstract 修饰的没有方法体的方法。所以一个简单的抽象类就应该像下面这样:
abstract class AbsClass {
abstract void absMethod();
// private abstract illegalMethod();
}
Java 从语法上阻止从抽象类直接创建对象,所以这样做不会通过编译。如果一个新类继承自某个抽象类,那么它必须实现其中的所有抽象方法,才能成为一个普通类,如果没有这样做,编译器会认为它还是一个抽象类,并提醒我们为其加上 abstract 关键字。
当然,我们还可以主动地为普通类加上 abstract 关键字,这样可以阻止创建该类地对象。
注意, private abstract 是不符合语法的,我们不可能在继承类中为这种方法完成定义。