抽象类和接口
一、抽象类和接口的定义
从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。即接口只能定义一系列方法,而不能包含方法的实现和变量,不能拥有自己的属性,但是抽象类能够拥有变量。
接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则。体现了自然界“如果你是……则必须能……”的理念。
//策略接口
public interface IStrategy
{
public void strategyInterface();
}
抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。
//抽象策略类
public abstract class Strategy {
public abstract void doSum(); //算法方法
}
二、接口和抽象类异同点
接口和抽象类相同点:
1 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。
2 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
接口和抽象类不同点:
1 接口只能包含抽象方法,静态方法和默认方法,不能为普通方法提供方法实现,抽象类可以有非抽象的方法。
2 接口只能定义静态常量,不能定义普通成员变量,抽象类里则既可以定义普通成员变量,也可以定义静态常量。
3 接口不能包含构造器,抽象类可以包含构造器,抽象类的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
4 接口不能包含初始化块,但抽象类里完全可以包含初始化块。
5 一个类最多只能有一个直接父类(C++中可以多个),包括抽象类,但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java、C#单继承不足。
6 一个类实现接口的话要实现接口的所有方法,而抽象类不一定
三、什么时候使用抽象类和接口
如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
如果基本功能在不断改变,使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
- 点赞
- 收藏
- 关注作者
评论(0)