接口是功能的集合,可看作是一种引用数据类型,是比抽象类更为抽象的"类".
接口只描述应该具备的方法,并没有具体实现.(接口中全都是抽象方法,不会有拥有方法体的普通方法),具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义与实现分离,优化了程序设计.
请记住:一切事物均有功能,即一切事物均有接口.
定义接口需要使用interface关键字
一个类可以继承多个接口并且不会出现安全隐患(因为接口中都是抽象方法,并没有方法主体,具体的功能都是由实现类定义的),但是必须实现所有接口的所有方法,这叫做接口的多实现,解决了JAVA中只有单继承的问题。
接口中成员的特点:
成员变量:成员变量的定义方式是固定的 public static final 数据类型 变量名称 = 变量值; 即接口中定义的只有常量,其中static是静态的,final是把变量值固定,永远都不会再改变中 定义的常量是不允许改变的,
成员方法:成员方法的定义方式也是固定的 public abstract 数据类型 方法名(); 即接口中只允许有抽象方法。
下面这种情况也是可以的,类继承类同时实现一个或者多个接口,但是类需要重写所有接口中的抽象方法。
接口和抽象类的区别,通过实例:进行分析和代码演示抽象类和接口的用法。
1、举例:
犬:
行为:
吼叫;
吃饭;
缉毒犬:
行为:
吼叫;
吃饭;
缉毒;
思考:由于犬分为很多种类,他们吼叫和吃饭的方式不一样,在描述的时候不能具体化,也就是吼叫和吃饭的行为不能明确。当描述行为时,行为的具体动作不能明确,这时,可以将犬的基本属性和行为写成抽象类。
可是当缉毒犬有其他额外功能时,这个功能并不在犬这个抽象类中,这是可以让缉毒犬具备犬科自身特点又拥有缉毒这个额外功能的时候,可以将这个额外功能定义到接口中。
代码演示:
interface 缉毒{
public abstract void 缉毒();
}
//定义犬科的这个提醒的共性功能
abstract class 犬科{
public abstract void 吃饭();
public abstract void 吼叫();
}
// 缉毒犬属于犬科一种,让其继承犬科,获取的犬科的特性,
//由于缉毒犬具有缉毒功能,那么它只要实现缉毒接口即可,这样即保证缉毒犬具备犬科的特性,也拥有了缉毒的功能
class 缉毒犬 extends 犬科 implements 缉毒{
public void 缉毒() {
}
void 吃饭() {
}
void 吼叫() {
}
}
class 缉毒猪 implements 缉毒{
public void 缉毒() {
}
}
抽象类和接口的区别:
相同点:1、都位于继承的顶端,用于被其他类继承或实现;
2、都不能直接实例化对象。
3、都包含抽象方法,其子类都必须重写这些抽象方法。
不同点:1、抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法。
2、一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
3、抽象类是这个事物中应该具备的内容,继承体系是一种is....a的关系
4、接口是这个事物中的额外内容,继承体系是一种like...a的关系
二者的优选:优先选用接口,尽量少用抽象类(接口可以减少类与类之间耦合,而类之间的继承耦合性很强)。
需要定义子类的行为,又要为子类提供共性功能时才选用抽象类。