接口
接口(interface)用来描述类应该做什么,而不需要描述应该具体如何做。
一个类可以实现(implement)一个或多个接口。
编译之后也是一个.class字节码文件
概念
接口不是类,而是对希望符合这个接口的类的一组需求。
特点
接口中的所有方法都自动是public方法。(但在实现接口时,必须把方法声明为public)
接口中只可以定义常量和抽象方法,但绝对不可能有实例字段。
接口与抽象类
学习接口的时候会有一个疑问:
为什么要那么麻烦引入接口的概念呢,直接定义抽象类不就行了吗?
然而每个类只能扩展一个类,但每个类可以实现多个接口。例如如果将Comparable定义为抽象类,Employee类已经继承了Person类,那么它想再继承Comparable抽象类就不行了。
public abstract class Comparable{
public abstract int compareTo(Object other);
}
class Person{
...
}
class Employee extends Comparable,Person { //错误
public int compareTo(Object other){...}
}
利用接口可以实现“多继承”。
另外,一个接口可以继承多个接口。
静态和私有方法
在Java8之后,可以在接口中定义静态方法。
在Java9中,接口中的方法可以是private,private方法可以是静态方法也可以是实例方法。由于私有方法只能在接口本身的方法中使用,所以它们的用法很有限,只能作为接口中其他方法的辅助方法。
接口在开发中的作用
注意:
接口在开发中的作用类似于多态在开发中的作用。
多态:面向抽象编程,不要面向具体编程。降低程序的耦合度,提高程序的扩展力。
总结:
接口+多态降低程序的耦合度,提高程序的扩展力。
面向接口编程遵循了OCP(Open Close Principle)开放-关闭原则:对扩展开放,对修改关闭。
接口的重要作用:解耦合
降低的是调用者和实现者之间的耦合度,一个项目中最难的部分时定义接口,而实现者的类和调用者的类可以分开并同时进行编写,也就是常说的面向接口编程。
例如:
//菜单接口
public interface FoodMenu{
void xiHongShi();
void fanQie();
}
//顾客类(接口的调用方)
public class Customer{
private FoodMenu foodMenu;
public Customer(){
}
public Customer(FoodMenu foodMenu){
this.foodMenu = foodMenu;
}
public void setFoodMenu(FoodMenu foodMenu){
this.foodMenu = foodMenu;
}
public FoodMenu getFoodMenu(){
return foodMenu;
}
public void order(){
foodMenu.xiHongShi();
foodMenu.fanQie();
}
}
//厨师类(接口的实现方)
public class Chef implements FoodMenu{
public void xiHongShi(){
System.out.println("西红柿");
}
public void fanQie(){
System.out.println("番茄");
}
}
public class Test{
public static void main(String[] args){
//创建厨师对象
FoodMenu chef = new Chef();
//创建顾客对象
Customer customer = new Customer(chef);
//顾客点菜
customer.order();
}
}
输出结果:
这个例子中,顾客只跟菜单打交道,不管后厨是谁,而厨师只管实现菜单上的菜。
如果将来厨师换了,只需要将测试类的对象改为新的厨师并利用多态创建新的对象即可。
FoodMenu chef = new NewChef();
顾客类的代码不需要更改任何一处。
哪怕把厨师类和测试类删了程序也能编译通过,把顾客类和测试类删了程序也能编译通过,这就充分的说明了调用者和实现者是毫不相干的,通过面向接口的编程达到了降低耦合度,提高程序扩展性的作用。
通过学习,自己也只是粗略总结了一下对接口理解,相信未来可以通过在项目中能够逐渐理解面向接口编程的妙处所在,冲冲冲~