抽象类
抽象类的定义
所谓抽象类,是指对某一个类的整体或根源的抽象描述,包括方法和属性。
对抽象类的理解
- 对于抽象类,一般继承的类与被继承的类之间的关系是“is a”的关系,表示被继承的类属于继承类的一部分;
- 抽象类是不能被实例化;
- 抽象类中可以有成员变量、抽象方法、构造函数、实体方法,并且抽象方法一般是由protected修饰的;
- 抽象方法名和抽象类名前必须使用abstract修饰;
- 抽象类存在的意义在于声明子类中共有的属性和方法,并约定子类应该有的行为;
- 抽象类可以继承接口,也可以继承另一个抽象类,但是只能一对一的关系,也就是单继承。
接口
接口的定义
所谓接口是指,对一个类的行为的抽象描述。
对接口的理解
- 对于接口,一般是指实现类与类之间具有“has a”的关系,表示实现类具有接口中定义的某种行为;
- 接口中只能包含抽象方法,一般是不推荐在接口中添加成员变量的;
- 接口中如果要添加成员变量,一般由public或default修饰,还可以使用static或final,并且必须要赋值;
- 接口可以继承接口,但是不能被类继承,也不能声明构造函数,属于多继承。
抽象类和接口的区别与选择
- 抽象类中可以包含抽象方法、成员变量、构造函数、普通方法,一般抽象方法是由protected修饰,而接口只能包含抽象方法,一般成员变量不推荐添加;
- 抽象类属于单继承,而接口属于多继承;
- 抽象类中可以含有构造函数,但是接口中不允许包含构造函数;
从设计的角度来理解抽象类和接口
面向对象编程和面向接口编程
- 面向对象编程和面向接口编程并不是平级的,面向接口编程是附属于面向对象编程,是面向对象编程的核心精髓。
- 接口,在表面上看,是由几个没有主体代码的方法定义组成的集合体,有唯一的名称,可以被类或其他接口实现。规定了实现本接口的类或接口必须拥有的一组规则。例如,在自然界,人都能行走、吃饭,那么就可以定义一个接口,用来封装一些行走、吃饭的方法,只要实现类中的对象具有这种行为,那么就可以实现这个接口。这也是符合面向对象的思想,将真实世界抽象成类。
* 接口是在一定粒度视图上同类事物的抽象表示,而这里的“同类事物”是相对的,它是因为粒度视图不同而不同。面向对象思想和核心之一就是多态性,也就是在某个粒度视图层面上对同类事物不加以对待而统一处理。 - 面向接口编程是在类图设计上需要考虑设计达到隔离和封装的作用,因此在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务,而是通过定义一组接口,仅向上层暴露其接口功能,上层对下层仅仅是接口依赖,而不依赖具体的类。这样做的好处是,首先能增大系统的灵活性,当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改,甚至可以在不修改上层代码时将下层整个替换掉;其次就是可以在使用不同部件或层次模块进行开发,能够提高效率。也可以说“面向接口编程”中的接口是一种思想层面的用于多态性、提高软件灵活性和维护性的架构部件,而具体语言中的“接口”是将这种思想中的部件具体实施到代码里的手段。(此处也只是自己的一点理解,如有错误,)
- 因此从另一个角度来看是选择接口还是选择抽象类,还需要看你使用的动机,使用抽象类是为了代码的复用,而使用接口的动机在于实现多态性。
抽象类和接口使用场景示例
抽象类
交通运输示例:
* 需求:对于汽车、高铁和飞机三种交通运输工具在时间、速度、价格上分别比较三种方式,由用户输入时间、距离、交通运输方式等,自动输出三种交通方式的所需时间、价格等信息。
* 设计类图
* 具体实现
抽象类
/**
* 抽象交通类
*/
abstract public class Traffic{
String name;//交通名称
double startTime;//到车站或机场的时间(分钟)
double endTime;//从车站或机场到目的地的时间(分钟)
double getTicket;//取票消耗时间(分钟)
double securityCheck;//安检时间(分钟)
double waiting;//候车时间(分钟)
double speed;//车速(公里/小时)
double price;//单价(元)
double allTime;//总时间(分钟)
double allPrice;//总花费(元)
/**
* 计算消耗时间和金钱
* @Param distance 距离
*/
abstract protected void Calculation(double distance);
/**
* 输出计算结果
* @Param distance 距离
*/
public void printResult(double distance){
Calculation(distance);
System.out.println(name+"交通方式,总耗时"+allTime+",总花费"+allPrice);
}
}
实现类
/**
* 汽车类
*/
public class Car extends Traffic{
/**
* 计算消耗时间和金钱
* @Param distance 距离
*/
@Override
protected void Calculation(double distance){
name = "汽车";
startTime = 20;
endTime = 20;
getTicket = 5;
securityCheck = 2;
waiting = 10;
speed = 70;
price = 0.32;
allTime = startTime + endTime + securityCheck + waiting + (distance/speed)*60;
allPrice = distance*price + 4;
}
}
/**
* 火车类
*/
public class