本讲要说明的几个问题:什么是抽象类,抽象类的特点,抽象方法,抽象方法与抽象类的关系。
1、什么是抽象类
抽象类,实际上就是对类的进一步抽象。
从前面的介绍中,我们知道在面向对象的分析和设计中有很多次抽象,从现实世界中的对象抽象出软件系统中的对象(保留主要属性和行为,去掉次要属性和行为),从软件系统中的对象抽象出软件系统中的类(去掉属性值,把具体的对象变成了抽象的概念),现在我们要介绍的抽象类是对多个类的抽象结果,抽象类中描述了多个具体类的共同特征和行为,与我们之前说的父类是类似,不同之处在于抽象类不能有具体的对象,抽象类可以有不用实现的方法。
典型的例子就是交通工具,我们知道飞机、轮船、汽车、火车都是交通工具,都可以把乘客从一个地方带到另外一个地方,但是各种不同的交通工具的运行方式是不同的,汽车沿着公路走,火车沿着铁路线走,飞机需要先起飞、飞行、然后降落,有一定的航线。正式因为有这些共同特征,才抽象出交通工具这样的类。
我们可以说具体的飞机、轮船、汽车和火车对象,但是没有交通工具对象,这时候交通工具就是抽象的。
2、如何定义抽象类
使用abstract关键字定义抽象类,例如:
public abstract class A{
...
}
如果某个类是抽象类,则这个类不能有具体的对象。
如果某个类没有具体的对象,这个类还有什么用呢?通过这个类可以派生出子类,子类可以是抽象类也可以是非抽象类。所以有抽象类通常都是作为父类存在的。
3、抽象方法
在前面的介绍中,我们知道方法包括如下组成部分:方法的修饰符、方法的返回值类型、方法的名字、方法的参数列表、方法体。例如:
public int getParentA(){
return super.a;
}
如果一个方法只给出方法的定义部分,而没有方法的具体实现,这个方法就是抽象方法。
例如:
public int getParentA();
抽象方法的含义:某个对象具有这样的方法,但是方法如何实现不清楚。
例如上面的例子,各种交通工具都可以把乘客从一个地方带到另外一个地方,所以交通工具应该具有一个方法——移动,但是具体如何移动,不清楚,所以如果要在交通工具这个类中定义这个方法,只能是抽象的。意味着,交通工具应该有一个方法(移动),但是具体如何实现,需要看具体的子类。
另外一个典型的例子是几何图形,在软件系统中需要画各种图形,每种图形是具体的类,而图形作为抽象类。要在系统中显示各种图形,每种图形类都应该有画的方法,但是各种图形的画法不同,例如三角形需要给出3个点,而圆需要给出圆心和半径,直线需要给出两个点。所以在图形抽象类中中只能声明这个一个画的方法,具体实现留给子类。
4、如何定义抽象方法
抽象方法使用关键字abstract定义,例如画图的方法可以定义为:
public abstract void print();
在类中,如果一个方法只给出声明,没有具体实现,应该使用abstract定义为抽象方法。
5、抽象方法与抽象类
如果一个类中出现了抽象方法,则这个类必须定义为抽象类。例如上面的图形类:
public abstract class Graphics{
...
public abstract void print();
}
子类可以去实现具体的画法,例如三角形:
public class Triangle extends Graphics{
private Point[] p; // 描述三角形的三个点
public abstract void print(){
... // 根据3个点画图
}
}
请记住:有抽象方法的类一定是抽象类。
抽象类一定要有抽象方法吗?不一定,抽象类可以没有抽象方法。
抽象类一定不能有实例,下面的代码是错误的:
Graphics g = new Graphics();
6、抽象类的作用
抽象类用于派生新的子类,子类在继承抽象类的时候,必须实现所有抽象方法,除非子类还是抽象类。
抽象类的子类允许是抽象类。
下次介绍面向对象的一大特性——多态性。
上一次: 第三十七讲 成员方法的继承与覆盖
下一次:第三十九讲 多态