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(); }