接口的特性:
接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
接口中的方法都是公有的。
编译时自动为接口里定义的方法添加public abstract修饰符
Java接口里的成员变量只能是public static final共同修饰的,并且必须赋初值,可以不写public static final,编译的时候会自动添加
接口可以用两方面概述:
一方面,有时必须从几个类中派生出一个子类,继承它们所有的属性和方法。但是,Java不支持多重继承。所以有了接口,就可以得到多重继承的效果。
另一方面,有时必须从几个类中抽取出一些共同的行为特征,而它们之间又没有is-a的关系,只是具有相同的行为特征而已。比如说:鼠标、键盘等,都支持USB连接。
其实接口可以看成是一种规范,定义的是一组规则。就像继承是一个“是与不是”的关系,而接口实现的则是“能与不能”的关系
接口,其英文为interface,在Java中是个抽象类型,是抽象方法的集合。虽然编写接口的方式和类很相似,但接口并不是类,它们属于不同的概念。类描述对象的属性和方法,而接口则包含要实现的方法。除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口是不能定义构造器的,这就意味着不可实例化,所以在Java开发中,接口通过让类去实现(implements)的方式来使用
如果实现类覆盖了接口中的所有抽象方法,则该实现类就可以实例化
如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍为一个抽象类
那么接口是否可以被继承呢?
答案是可以的
类和类之间的关系有继承,接口和接口之间也可以继承
一个接口能继承另一个接口,和类之间的继承方式比较相似。
接口的继承使用extends关键字,子接口 继承父接口的方法。
而且接口允许多继承
下面用“猫”的行为特征,作为简单的接口,方便理解一下
首先,用interface接口定义其行为特征,比如:爬树,吃,捕猎,奔跑等
再实现方法:
然后在主方法中调用:
输出结果:
当然爬树,吃,捕猎,奔跑等行为特征,豹子也具备
所以接口中的方法是公有的
其实有个类和接口很相似,它同样不能实例化对象;同样位于继承的顶端,用于被其他类实现或继承;同样包含抽象方法,其子类都必须覆写这些抽象方法
它就是:抽象类
它们的区别在于:
抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;
而接口只能包含抽象方法;一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
抽象类是这个事物中应该具备的内容, 继承体系是一种 is-a关系;
接口是这个事物中的额外内容,继承体系是一种 like-a关系
二者的选用:
优先选用接口,尽量少用抽象类;
需要定义子类的行为,又要为子类提供共性功能时才用抽象类;
要实现的方法不是当前类族的必要,而是扩展,用接口。