2015-10-19 21:12:36
知道接口和抽象类有所不同,但总是考虑不全,现在总结一下:
抽象类:
[public|proteced] abstract class 类名称 [extends父类名列表] [implements接口名列表]
{ [public] abstract 返回值类型 方法名(参数列表);
//其他
}
接口:
[public]interface 接口名称 [extends父接口名列表] { //静态常量 [public] [static] [final] 数据类型变量名=常量值; //抽象方法 [public] [abstract] [native] 返回值类型 方法名(参数列表); }
1、接口的修饰符只有public,抽象类必须在类前用abstract修饰。
2、接口中的变量会被隐式地指定为 public static final 类型(必须给其初值,在实现类中不能重新定义,也不能改变其值),方法会被隐式地指定为 public abstract 类型,即接口中所有的方法都必须是抽象方法。
抽象类可以有非抽象的成员变量和方法,它要求至少有一个抽象方法。
补充:如果一个类不包含抽象方法,只是用 abstract 修饰的话也是抽象类,也就是说抽象类不一定必须含有抽象方法。个人觉得这个属于钻牛角尖的问题,因为如果一个抽象类不包含任何抽象方法,又何必定义成抽象类。
3、如果实现了某个接口的是非抽象类,它必须实现该接口中的所有方法;如果实现该接口的是抽象类,可以不实现该接口中的抽象方法。
当一个类继承一个抽象类时,除非将该子类也定义为抽象类,否则它必须实现父类的全部抽象方法,而普通方法可以有选择地重写。
4、子类能够同时实现多个接口;子类只能单继承抽象类(抽象类任然是类,任然具有单继承性)。
6、抽象类所跨域的是具有相似特点的类,所体现的是一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在is -a关系,即父类和派生类在概念本质上应该是相同的。
接口却可以跨域不同的类,并不要求接口的实现者和接口定义在概念本质上是一致的, 仅仅是实现了接口定义的契约而已。
7、抽象类是对一种事物的抽象,即对类抽象,是对整个类整体进行抽象,包括属性、行为。
接口是对行为的抽象,是对类局部(行为)进行抽象。
8、抽象类作为很多子类的父类,它是一种模板式设计,如果需要添加新的具体的方法,可以直接在抽象类中添加,子类可以不进行变更。
接口是一种行为规范,它是一种辐射式设计,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
9、对于抽象类而言,它是自下而上来设计的,我们要先知道子类才能抽象出父类。
接口不同,它根本就不需要知道子类的存在,只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。