接口的概述
是一些方法特征的集合,而这些方法可以被多个实现类去各自实现。
接口的特点
- 接口文件最后同样也会被编译器编译成服务接口·class的字节码文件;
- 接口跟抽象类一样,同样不能被实例化;
- 接口在使用上来讲,不能被实例化,所有的抽象方法都必须由接口的实现来实现;
- 接口中的所有方法都只能定义成抽象方法,不能拥有方法体;
- 接口中的所有方法,访问修饰符默认就是public,即便是不写也是public(接口方法中,可以不写public、abstract修饰符,不写,编译器会自动给我们添加上public和abstract);
- 接口中不能拥有构造器,以及初始化块(静态初始化块);
- 接口不能定义“成员变量”,只能定义公开的,并且是静态的常量。(在定义常量时可以去掉public、static、final)(注:这里去掉public后得记住此处不是同包(default))
- (在定义常量时可以去掉public、static、final)(注:这里去掉public后得记住此处不是同包(default))
- JDK1.8之后出现的新特性:
- JDK1.8之后,在接口中可以使用default关键字,声明非抽象方法,但是真正的访问修饰符,依旧还是public,default此时只是一个声明关键字,不是一个访问修饰符。
- 接口中可以使用static声明静态方法,但是必须有方法体的实现“{ }”
类不能继承接口,只能实现接口
类中能单继承,但是可以多实现(接口之间采用“逗号”间隔)。
接口的使用
- 使用interface来声明接口。
- 接口可以使用extends继承接口。
- 类可以使用implements来实现接口中的抽象方法。类一旦实现了接口就必须遵从“契约”(实现接口中的所有方法)。
- 一个类只能继承一个父类,但可以实现多个接口,接口与接口之间用“,”隔开。
- 接口在设计时,需遵从接口最小化原则
接口的声明
在Java语言中,关键字interface用于声明接口
public interface 接口名{
}
接口具有下列性质:
- 接口默认是抽象的。在声明接口时,不需要使用关键字abstract;
- 接口中的每一个方法默认也是抽象的,所以也不需要关键字abstract;
- 接口中的方法默认访问级别是public。 在编写接口的时候通常用public关键字,但是如果我们不显式地将接口中的方法声明为public,它仍然将是public的。
接口的实现
接口不能被实例化,因为接口中的方法都是抽象的,所以需要一个类来实现接口。当接口被一个类实现的时候,我们可以简单地认为类与接口之间签订了一个合同,类必须要实现接口所定义的行为,也就是是要履行合同。如果类不能执行接口中所定义的所有行为,那么,类必须声明自己是一个抽象类。
类实现接口时有两个选择:
- 实现接口中定义的所有方法;
- 声明自己为抽象类。
public class 类名 extends 父类名 implements 接口名
接口的原则
- 使用接口解决多继承;
- 使用接口为外部类添加功能
- 以面向对象的角度考虑将一个类与身自来的特征和行为和依赖于外部的可选的特征和行为分离,让类尽可能的丰富,让我们在设计程序的时候,不再关注具体的类,而是分离关注类上拥有哪些接口所定义的能力,从而做到程序设计时,类-类的直接关系,变换为类-接口-类,这种变换关系,也被称之为“解耦”。
接口的优点
- 将设计和实现分离对外(调用者)隐藏了实现(而通常调用者也不需要关心实现);
- 面向接口编程是OOP的核心;
- 可以使用接口暴露类的行为;
- 用接口来规范类的行为。
接口与多态
- 接口同样是一种多态的体现,因为它也满足“相同的行为,不同的实现”;
- 接口和实现类之间的关系,依旧是“is-a”的关系,同样可以使用转型技术