定义
接口在面向对象编程中占着很重要的地位,它是对于一种事物行为的抽象提取,内部只需要持有接口的引用,外部可以根据具体事物做不同的扩展,而不修改内部的引用逻辑,它的主要作用是在框架中实现不同对象的相互引用解耦,而不是持有具体类的引用。在百度中对接口
的定义:对接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被内部修改而不影响外界其他实体与其交互的方式。
定义一个接口的格式如下:
[public] interface InterfaceName {
}
接口变量会被隐式的指定为public static final
,如果用public
修饰会报编译错误,而方法会被隐式指定为public abstarct
,用其他修饰符修饰就会报错。接口的方法不能有具体的实现,它是一种极度
抽象的类型,比抽象类更加抽象
,一般不会在接口中定义变量。
类实现接口使用implements
class ClassName implements Interface1,Interface2,[....]{
}
一个类可以实现多个接口,且必须实现里面的所有方法
抽象类 同样在面向对象编程中占有一定的地位,它可以对于某一种事物的抽象能力提取,同时可以在抽象类中实现公有的行为,也可以对接口做一定的适配,减少具体实现类要重写所有方法的问题,起到一个适配器的作用,同时在编程中担任一个基类
的作用,对于公有行为的提取。百度中对抽象类
的定义如下:抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
抽象方法定义格式:
[public] abstract class ClassName {
abstract void fun();
}
抽象类定义格式:
[public] abstract class ClassName {
abstract void fun();
}
由于抽象类含有无具体的实现方法,所以抽象类不能用来创建对象,抽象类也可以无抽象方法,只要类是抽象的。
和普通类的区别:
1 .抽象方法必须是
public
或者protected
,缺省为public
,为private
则子类无法实现抽象类方法
2 .抽象类不能用来创建对象
3 .一个类继承抽象类,必须实现里面的所有抽象方法。
异同
1.同
- 1 .不能实例化;
- 2 .包含未实现的方法声明;
- 3 .派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)。
2.异
语法层面:
- 1 .类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口是用来解决多重继承问题的。
- 2 .抽象类当中可以存在非抽象的方法,可接口不能,且它里面的方法只是一个声明必须用public来修饰没有具体实现的方法。
- 3 .抽象类中的成员变量可以被不同的修饰符来修饰,可接口中的成员变量默认的都是静态常量(
static final
)。- 4 .抽象类是对象的抽象,然而接口是一种行为规范。
- 5 .接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
设计层面:
1 .抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。
2 .设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。
使用场景
1 . 由于抽象类中不一定都是抽象方法,也可以有具体的方法,所以可以把公有的方法提升到抽象类中,然后具体的方法留给子类实现(
模板设计模式
) ,可以更好的实现代码的复用,典型的BaseActivity
,BaseFragment
2 . 抽象类表示的是这个对象是什么
,而接口表示的是这个对象能干什么
,面向对象的编程语言中,一个类只能继承一个类(抽象类),但是可以实现多个接口。当你关注一个事物的时候,用抽象类;当你关注一个操作的时候,用接口。3 .另一个重要的概念就是
多态
,多态
通过分离做什么和怎么做,从另一个角度将接口和实现分离出来。多态不但能够改善代码的组织结果和可读性,还能创建可扩展的程序—-即无论在项目最初创建时还是在需要添加新功能时都可以“生长”的程序。由于接口更关注于动作的实现,多态主要是分离“做什么”和“怎么做”,所以接口的另一个重要的应用就是多态的实现(当然抽象类也可以实现多态,但是接口更加合适)。抽象类的功能要远超过接口,但是,定义抽象类的代价高。因为高级语言来说(从实际设计上来说也是)
每个类只能继承一个类
。在这个类中,你必须继承或编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述
。而且你可以在一个类中同时实现多个接口,在设计阶段会降低难度的。