在Java语言中,类有两种:一种是具体类,另一种是抽象类。具体类可以实例化,抽象类不可以被实例化。
抽象类仅提供一个类型的部分实现。抽象类可以有实例变量,以及一个或多个构造函数。抽象类可以同时有抽象方法和具体方法。
一个抽象类不会有实例,这些构造方法不能被客户端调用来创建实例。一个抽象类的构造方法可以被其子类调用,从而是一个抽象类的所有子类都可以有一些共有的实现,而不同的子类可以在此基础上有其自己的实现。
抽象类和子类的这种关系实际上是模版方法模式的应用。
先有蛋,后有鸡
套用“先有鸡,还是先有蛋”的争论,假设蛋代表抽象,而鸡代表具体。蛋决定鸡的性状,鸡是蛋的“实现”,蛋的类型决定了鸡的类型。从这个角度来讲,先有蛋,后有鸡,如图所示。
Java抽象类与Java接口一样,都用来声明一个新的类型,并且作为一个类型的等级结构的起点。但是Java接口具有比Java抽象类更好的特性,因此,应当优先使用Java接口声明一个超类型。