一、抽象类
含有abstract修饰符的类为抽象类,抽象类可以拥有自己的构造函数,但是不能直接通过new进行实例化,可以通过子类继承,实例化子类的时候抽象类也会被实例化。
抽象类可以包括方法也可以包括抽象方法,这是类所不能的。抽象方法只能声明于抽象类中,且不能进行实现,派生类必须覆盖它们。
抽象类可以派生一个抽象类,可以覆盖基类的抽象方法也可以不覆盖。
二、接口
接口是引用类型,不能被实例化,一旦继承必须全部实现,可以多继承,不能有访问修饰符,不能实现方法。
和抽象类有三点相似之处:1.不能被实例化 2. 包含未声明的方法 3.派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员。
接口有以下特性:
接口除了可以包含方法外,还可以包含属性、索引器、事件,而这些成员都被定义为共有的。除此之外,不能包含任何其他成员,例如:常量、域、
构造函数、析构函数、静态成员。
抽象类和接口的区别:
1.抽象类只能单继承,接口可以多继承。
2.抽象类中可以声明构造函数,接口中不可以。
3.抽象类中可以使用public、private、protected等访问修饰符,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
4.抽象类中可以包含static静态方法,接口中不行。
5. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
6. 抽象类中可以包含非抽象的普通方法,接口只能声明不能实现。
7. 抽象类中可以有普通成员变量,接口中不能。
抽象类和接口的使用场景:
抽象类:
抽象类主要用于关系密切的对象 ,组件的所有实现间提供通用的已实现功能,
如果要创建组件的多个版本,设计大的功能单元 ,将使用抽象类。
接口:
接口适合互不相关的类提供通用功能,小而凝练的功能块也使用接口。好的接口定义要具有专一性,避免造成接口污染。
如果一个类只实现了这个接口中的一个功能,而不得不去实现接口中的其他方法,这就叫接口污染。