JDK8开始接口中新增的方法
- JDK7以前:接口中只能定义抽象方法
- JDK8的新特性:接口中可以定义有方法体的方法(类型:默认(抽象)、静态)
- JDK9的新特性:接口中可以定义私有方法
在一个项目当中,一个接口被写好,然后由其他组使用,到了后期因为一些情况需要在接口中新增一些行为,那么其他组写的代码就得跟着一起改变,新特性为了避免这种现象,就加了新特性
接口升级:
一个app的版本得到了升级,随之它的接口中的功能也增加了很多,这就叫做接口升级。在接口升级的时候就可以使用有方法体的方法了
JDK8以后新特性使用规则: - 允许在接口中定义默认方法,需要使用关键字default修饰
作用:解决接口升级的问题
接口当中的默认方法
- 接口中默认方法的定义格式:
格式:public default 返回值类型 方法名(参数列表){}
范例:public default void show(){} - 接口中默认(指的是public这个关键字可以不写,前提到的接口中的抽象方法默认,指的是public abstract关键字可以不写)方法的注意事项:
默认方法不是抽象方法,所以不用被重写。但是如果要重写,重写的时候要去掉default关键字
public可以省略,default不能省略
如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须重写方法
从图中可以看出,我们在只改变接口中代码的情况下,也实现了对象调用接口中的方法
当想要重写方法时,只需要写出方法名,回车即可。而后,要将对应的default关键字去掉
当对接了多个接口,并且接口中,有同名的方法,那么就必须进行重写,不然如下报错
接口当中的static方法
JDK8以后接口中新增的方法:
- 允许接口中定义静态方法,需要用static关键字修饰
接口中静态方法定义格式:
public static 返回值类型 方法名(参数列表){}
范例:public static void show(){} - 接口中静态方法的注意事项:
静态方法只能通过接口名调用,不能通过类名或对象名来调用
public可以省略,static不能省略
静态方法不能被重写
从图上看出,调用方式不正确,必须用接口名来调用
从新复习一下重写的概念:重写是将子类从父类中继承下来的方法表中的某个方法进行覆盖,这样一来,确定的对象,调用确定的同名方法
JDK9以后新增的方法(私有方法)
在接口中,一些只服务于接口中方法的重复的代码,并且不希望外界能够访问或使用,那么我们就把它设置为私有的
在之前,我们是通过将重复的代码提出作为一个方法,用的时候再调用,但多数时候,由于这样的代码主要服务于行为,所以它实际上对用户来说没有什么意义,我们也不希望他被调用,于是乎就将其设定为私有
接口中的私有方法分为:
1.普通的私有:
格式:private 返回值类型 方法名(参数列表){}
范例:private void show()
服务于上面提到的默认(仅default修饰)方法
2.用static修饰的私有方法:
格式:private static 返回值类型 方法名(参数列表){}
范例:private static void show(){}
服务于上面提到的静态(仅static修饰)方法
接口的应用
- 对于类:我们将多个类、但不是所有类要用到的方法定义为接口
- 当一个方法的形参,是接口,那么,我们可以穿低于这个接口对接的任何类的对象(这叫做接口的多态)
与面对对象的多态相同,类似于,父类引用指向子类实例化-->接口的引用指向实现类的对象:接口类型 对象名 = new 实现类名();
总结
- 1.接口代表规则,是行为的抽象。想要让那个类拥有一个行为,那就与这个接口对接
- 2.当一个方法的形参数据类型是接口类型时,可以传递接口所有实现类的对象,这种方式称之为接口多态
适配器设计模式
什么是设计模式?
- 设计模式是一套被反复使用、多数人只晓的、经过分类编目的、代码设计经验总结。
使用设计模式是为了可重用代码、让代码容易被他人理解、保证代码可靠性、程序的重用性。
简单理解:设计模式就是各种套路 - 适配器设计模式作用:解决接口与接口实现类之间的矛盾问题
什么矛盾呢?
测试类需要调用某一个方法,而这个方法在某个接口中,那么我将这个接口实现。但事实上,我只需要用到其中的一个方法,按这个接口中有100个方法,又由于接口的特性,我学要将其它99个方法进行重写。所以这个时候我们就要用适配器设计模式来解决这个问题
适配器(adapter)的创建与使用
- 创建一个类adapter,利用implements关键字与目标接口对接,并对接口中所有的方法进行空实现(不写方法体)
- 实现类不再对目标接口对接,而是对类adapter进行继承
- 而后再对想要调用的方法进行单独重写即可
- 那么我们再回过头来看这个类adapter,这个类中没有属性,而且重写的方法都是空方法,那么这个适配器对外界来说是没有任何意义的,我们也不希望外界能创建出它的对象以避免不必要的麻烦,所以我们利用abstract关键字把它改变为抽象类
当然,这么来看代码量并没有减少。但实际上主要目的是为了减少实现类当中的代码量,一边清晰、快捷、方便的查看代码。(我们要分清主次)
还有一个小细节
适配器的使用需要实现类去继承适配器,但有可能这个实现类已经继承过一个父类了,根据继承的概念,子类是只能单继承、不能多继承的。如何解决呢?
解决方法:让适配器继承父类,子类再继承适配器