1 接口升级
- JDK7 以前:接口中只能定义抽象方法。
- JDK8 的新特性:接口中可以定义有方法体的方法。(默认、静态)
- JDK9 的新特性:接口中可以定义私有方法。
2 JDK8 开始接口中新增的方法
2.1 默认方法 default
- 允许在接口中定义默认方法,需要使用关键字 default 修饰
作用:解决接口升级的问题(即以前接口的那些实现类,可以不立即重写接口新增的方法) - 接口中默认方法的定义格式
格式:public default 返回值类型方法名(参数列表){}
范例:public default void show(){ } - 接口中默认方法的注意事项:
默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉 default 关键字
public可以省略,default 不能省略
如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
2.2 静态方法 static
- 允许在接口中定义定义静态方法,需要用 static 修饰
- 静态方法不能被重写
- 接口中静态方法的定义格式:
格式:public static 返回值类型方法名(参数列表){}
范例: public static void show() { } - 接口中静态方法的注意事项:
静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
public可以省略,static不能省略
3 JDK9 新增 私有方法
由于接口中的多个方法之间,可能有很多重复代码,那么就希望抽取到私有方法内,只供本接口使用,不希望外界调用
3.1 接口中私有方法的定义格式:
- 格式1:private 返回值类型 方法名(参数列表){} (服务于默认方法)
范例1: private void show() { } - 格式2:private static 返回值类型 方法名(参数列表){} (服务于静态方法)
范例2: private static void method() { }
4 总结
- JDK7以前:接口中只能定义抽象方法。
- JDK8:接口中可以定义有方法体的方法。(默认、静态)
- JDK9:接口中可以定义私有方法。
- 私有方法分为两种:普通的私有方法,静态的私有方法
总结:接口可以定义默认方法(可以被重写),以及静态方法(不可以被重写),私有方法(是为了抽取重复代码而存在)
2 接口的应用
接口做为参数传递
即可以接收这个接口的所有实现类对象
只要车 和 搬家公司 都实现了 运输接口,那么都可以传递过来
2.1 总结
- 接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了
- 当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态。
3 适配器设计模式
3.1 设计模式
- 设讨模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
- 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
- 简单理解:设计模式就是解决各种问题的套路
3.2 适配器设计模式
适配器设计模式:解决接口与接口实现类之间的矛盾问题
3.2.1 接口与接口实现类之间的矛盾问题
比如接口内有十个抽象方法,但实现类只想用第五个方法,但是由于抽象方法必须全部重写,所以矛盾
3.2.2 例子
接口
package com.bjpowernode.test09;
public interface Inter {
public abstract void method1();
public abstract void method2();
public abstract void method3();
public abstract void method4();
public abstract void method5();
public abstract void method6();
public abstract void method7();
public abstract void method8();
}
适配器
package com.bjpowernode.test09;
//一般适配器会写成抽象的,目的是为了不让外界创建它的对象
public abstract class InterAdapter implements Inter {
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
@Override
public void method4() {
}
@Override
public void method5() {
}
@Override
public void method6() {
}
@Override
public void method7() {
}
@Override
public void method8() {
}
}
实现类
package com.bjpowernode.test09;
//写继承适配器(类),就可以不用全部重写
//不要写实现接口
public class Intermpl extends InterAdapter {
//我需要用到那个方法,就重写哪个方法就可以了
@Override
public void method5() {
System.out.println("只要用第五个方法");
}
}
3.3 总结
一个接口中抽象方法过多,但是我只要使用其中一部分的时候,就可以适配器设计模式
书写步骤:
- 编写中间类 XXXAdapter 实现对应的接口
- 对接口中的抽象方法进行空实现(方法体空着)
- 让真正的实现类继承中间类,并重写需要用的方法
- 为了避免其他类创建适配器类的对象,中间的适配器类用 abstract 进行修饰
参考链接: