抽象类用于要创建一个体现某些基本行为的类,不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类。abstract方法不能被声明为private,因为abstract类会被其他类继承。无法生成一个abstract类的对象,但可声明一个abstract类类型的变量。(is-a)
接口中所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口只可以定义static final成员变量。允许使用接口名作为引用变量的类型。通常的动态联编将生效。instanceof 运算符可以用来决定某对象的类是否实现了接口。(has-a)
以下情况,此类必须声明为abstract:
该类有一个或超过一个abstract方法(声明但没有定义的方法)
该类从一个abstract类继承一个或超过一个abstract方法,但没有提供这些方法的实现方法
该类实现一个接口,但没有将该接口所有的方法加以实现
interface的特性整理如下:
1. 接口中的方法可以有参数列表和返回类型,但不能有任何方法体。
2. 接口中可以包含字段,但是会被隐式的声明为static和final。
3.接口中的字段只是被存储在该接口的静态存储区域内,而不属于该接口。
4. 接口中的方法可以被声明为public或不声明,但结果都会按照public类型处理。
5. 扩展一个接口来生成新的接口应使用关键字extends,实现一个接口使用implements。
interface在某些地方和abstract有相似的地方,但是采用哪种方式来声明类主要参照以下两点:
1.如果要创建不带任何方法定义和成员变量的基类,那么就应该选择接口而不是抽象类。
2.如果知道某个类应该是基类,那么第一个选择的应该是让它成为一个接口,只有在必须要有方法定义和成员变量的时候,才应该选择抽象类。因为抽象类中允许存在一个或多个被具体实现的方法,只要方法没有被全部实现该类就仍是抽象类。