Java的单继承机制具有一定的局限性。
不能同时继承多个父类，导致子类实现的功能单一。
所以为了弥补这块的不足，Java提出了接口的概念：

接口
接口是多个功能(抽象方法)的集合。
接口存在的目的就是让子类继承，并重新里面的抽象方法
接口是一种比抽象类还要抽象的类。
接口里没有任何的普通方法，接口里的所有方法必须都是抽象方法。
接口里的方法默认就是抽象的，就是使用：
public abstract修饰的


接口就是一种公共的规范标准，只要符合标准，大家都可以使用。

Java中接口存在的意义：
用来定义规范
用来做功能的扩展

接口也是类的一种，或者说，接口和类一样都属于引用数据类型
哪些是Java的引用数据类型？
Java中除了8种基本数据类型之外的任意类型都是引用数据类型。
Java中的引用数据类型：
    类   class
    数组
    接口  interface
    枚举
    注解

定义接口的关键字是：interface
子类实现接口的关键字是：implements

子类允许实现多个接口。
接口不能实例化，我们不能创建接口的对象，
但是可以创建接口的实习类（子类）的对象

接口的实现类
要么重写接口中所有的方法
要么该实现类必须是一个抽象类

接口里的成员变量，默认都是使用public static final修饰的
接口里的任何成员变量，都必须是公共的，静态的，常量

接口里有构造方法吗？
接口的作用就是为了扩展子类的功能，根据就没有构造方法。

接口里的方法默认就是public abstract修饰的
只不过在Java8和java9之后增加了一下新特性。

类和接口的关系：
    类和类之间是继承关系，只能单继承，但是可以多层继承
    类和接口之间是实现关系，可以但实现，也可以多实现。一个实现类可以实现多个接口
    接口和接口之间是继承关系，但是接口之间可以多继承。


创建一个接口：UserDao
在里面创建一下方法：
增加用户：addUser()
修改用户：updateUser()
删除用户:deleteUser()
查询用户列表：queryList()
查询单个用户：queryOneUser()

创建一个实现类：UserDaoImpl
实现UserDao接口，重写所有方法，
比如：
public void addUser(){
    System.out.println("增加用户...");
}

案例：
定义USB接口(接口具备【开启功能】、【关闭功能】)，笔记本要使用USB设备，
就是笔记本在生产的时候需要预留出可以插入USB设备的USB接口，
就是笔记本【具备使用USB设备的功能】，但是具体是什么USB设备，
笔记本并不关心，只要符合USB规范的设备都可以。鼠标和键盘要想能在笔记本电脑上使用，
那么就必须要符合USB规范，不然即使生产出来也无法使用。

需求：
- 请描述笔记本类，实现笔记本使用USB鼠标和USB键盘功能
- USB接口具有开启功能``open();``，关闭功能``close();``
- 笔记本类：包含开机功能``run();``，关机功能``shutdown();``,
使用USB设备功能：``useUSB(USB usb);``
- 鼠标类：符合USB接口（实现USB接口）  鼠标开启，鼠标关闭
- 键盘类：符合USB接口（实现USB接口）  键盘开启，键盘关闭


接口在Java8和Java9之后先后做了一下修改：
Java8后-接口可以声明【默认方法】：
public default void method(){

}
作用是解决接口升级的问题。
默认方法不是抽象方法，所以不能强制重写，但是可以被重写，重写的时候去掉default关键字。
默认方法可以省略public关键字，但是不能省略default关键字。
如果实现了多个接口，但是多个接口中存在相同的方法声明，那么子类就必须要对这个方法进行重写。
Java8后-接口可以声明【静态方法】：
public static void method(){

}
静态方法只能通过接口名调用，不能通过实现类或者对象名调用
public可以省略，static不能省略

Java9之后-接口增加了私有方法
java9之后增加了带有方法体的私有方法，Java8允许接口中定义带有方法体的默认方法或静态方法。
这样就可能引发一个问题：当两个默认方法或两个静态方法包含一段相同的代码实现。
程序就必须考虑把这段代码抽取成一个共性的方法。但是这个共性方法是不需要让别人使用的，
所以使用私有化private把方法给隐藏起来，就是很有必要的。也就是Java9增加接口的私有方法的原因。

interface MyInter{
    default void method01(){
        baseMethod()
    }
    default void method02(){
        baseMethod();
    }
    //接口中的私有方法，不让外部使用，只是让自己使用。
    //是当前接口多个方法的相同代码进行抽取得到的。
    private void baseMethod(){
        System.out.println("这是100行代码");
    }
}
注意：
    默认方法可以调用私有的静态方法和非静态方法
    静态方法只可以调用私有的静态方法。



创建一个接口：UserService
在里面创建一下方法：
增加用户：addUser()
修改用户：updateUser()
删除用户:deleteUser()
查询用户列表：queryList()
查询单个用户：queryOneUser()

创建一个实现类：UserServiceImpl
实现UserService接口，重写所有方法，在方法中分别调用UserDao对象中对应的方法
比如：
UserDao userDao=new UserDao();  //不能创建接口的对象，会报错，因为接口不能创建对象。
UserDaoImpl userDao=new UserDaoImpl();//可以创建接口实现类的对象。
public void addUser(){
    userDao.addUser();
}




