Java抽象类的概念和使用
自上而下的继承层次里,越靠上的类越通用,甚至更抽象。祖先类往往只包含最基本的成员,人们只把它当作派生其他类的基类,而不会拿它来 new 对象。方法也可以只给出定义、不写实现,交给子类按具体需求去完成。
这种只有定义、没有方法体(没有 {})的方法叫做抽象方法。含有一个或多个抽象方法的类必须声明为抽象类,用 abstract 修饰。
| 说法 | 对不对 |
|---|---|
| 包含抽象方法的类一定是抽象类 | 对,否则编译失败 |
| 抽象类一定包含抽象方法 | 错,可以一个抽象方法都没有,只为了禁止 new |
| 抽象类不能有构造方法 | 错,可以有普通构造,供子类 super();不能是 abstract 构造 |
| 抽象类不能被实例化 | 对,但可以声明抽象类型的变量指向子类实例 |
一、抽象类里可以有具体成员
抽象类除了抽象方法,还可以包含实例变量和已经实现好的方法。即使没有任何抽象方法,也可以声明为抽象类,专门防止被实例化。抽象方法必须在具体子类中实现(子类若仍不实现,自己也得继续抽象)。
运行结果:我的名字叫王明,我正在讲课……;我的名字叫小陈,我正在开车……。name 和 getter/setter 是公共实现,work() 留给各职业自己填。
二、怎么使用抽象类
抽象类不能直接 new People(),必须用子类去实现,再用子类实例。但可以声明类型为抽象类的变量,让它指向具体子类,也就是把抽象类当形参、实现类当实参——这是多态。
不能有抽象构造方法,也不能有抽象静态方法。构造方法可以有,只是用来给子类初始化父类那部分状态。
三、什么时候类必须是抽象的
-
类里有一个或多个抽象方法。 -
它是抽象类的子类,却没有把父类抽象方法全部实现完。 -
它实现了某个接口,却没有把接口里的抽象方法全部实现完。
这些情况下类必须是抽象类;反过来,抽象类不必出现这些情况——它可以是一个方法全都实现好的类,只是不允许直接实例化。
一句话总结:抽象方法没有方法体,有它的类必须 abstract;抽象类不能 new,但可以当类型指向子类,把公共实现留在父类、差异留给子类。
转载请注明来源:Java抽象类的概念和使用







