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