我感觉两篇写的很好的博文
我的博客写的很简略, 如果想详细了解这个接口的相关概念, 我推荐下面这两个
java 基础-接口全网最详细的教程
JDK 8 后的接口新特性
接口
接口可以理解成一种规则
接口是谁想用谁去对接
当我们需要给多个类但并不是全部的类定义规则的时候我们就要用到规则, 通过 implements 实现这个接口的功能.
接口与抽象类的异同
抽象类是用来表示一些事物
接口表示一些行为
除此之外:
- 实现方式不同。抽象类可以有构造方法,接口不能有构造方法;抽象类中可以有普通成员变量,接口中只能有静态常量;抽象类中可以有普通方法(非抽象方法),接口中只能有抽象方法(没有实现的方法);接口中的成员变量默认为 public static final 类型,而抽象类中的成员变量可以任意类型。
- 多继承不同。一个类只能继承一个抽象类,但可以实现多个接口;一个接口可以被多个类实现,但只能继承一个抽象类。
- 用途不同。抽象类主要用于对一类事物的描述,比如动物、图形等;接口主要用于定义行为规范,比如Runnable、Serializable等。
调用方式不同。调用抽象类时需要先实例化对象,然后通过对象调用成员变量和方法;调用接口时不需要实例化对象,直接使用接口名调用即可。
如何定义一个接口
接口的文件名后缀依然是这个 .java
文件, 我们在这个文件中把这个 class 改为这个 interface, 就可以了, 通过这种方法, 我们就实现了这个接口的定义
Public interface 接口名{ }
接口不能实例化
接口和类之间是实现关系,通过 implements 关键字表示
Public class 类名 implements 接口名
接口中的方法都是抽象的方法
接口的子类(实现类)
要么重写接口中的所有抽象方法
要么是抽象类
如何使用一个接口
接口中的成员有什么特点
接口和类的关系
- 类和类的关系
继承关系,只能单继承,不能多继承,但是可以多层继承 - 类和接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口, 但是要记得重写. - 接口接口和接口的关系
接口与接口之间也可以进行互相继承, 可以单继承, 也可以多继承
接口与接口之间的继承关系是用 extends
package connection_for_jiekou;
public interface interface3 extends interface1,interface2{
public abstract void method3();
}
之后我们如果想要调用这个接口三, 我们就需要把这个接口三继承的两个父接口也要重写
package connection_for_jiekou;
public class method implements interface3{
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
}
当多个接口中有重名的方法, 我们同时继承了多个接口, 我们对这些重名的方法只需要重写一次就行了
对于这些重名接口的调用, 我们采用就近原则
JDK 8 开始接口中新增的方法
Default 方法
JDK 7 以前: 接口中只能定义抽象方法。
JDK 8 的新特性: 接口中可以定义有方法体的方法。(默认、静态)
JDK 9 的新特性: 接口中可以定义私有方法。
如果接口中新添加了一个新的规则, 此时的子类规则要全部进行修改否则就会报错, 这样的话不利于维护, 怎么办呢
如果接口中有方法体的方法就行了, 这样就不需要子代规则重新写了.
于是 JDK 8 之后出来了一种新的特性, 将函数用 default 来进行修饰, 可以在这个函数内部加入方法体.
[!example]
接口中定义的 default 方法, 在这个方法中我们可以写方法体
// JDK8之后我们可以定义这个方法的内部方法体
public default void drink(){
System.out.println("====喝====");
}
这个 drink 方法在实现接口的类中是不需要进行重写的, 因为它不是抽象方法, 所以这个方法可以直接被实现接口的类使用, 当然如果你想重写, 也是可以的.
default 不要求你进行强制的重写
静态 static 方法
静态方法不能够进行重写
静态方法, 只能通过接口名调用, 不能通过实现类名或者对象名调用
JDK 9 以后新增的方法
JDK 以前我们解决不同的方法的重复代码的方法, 就是定义一个新的方法
但是你这个新定义的方法是个 public 类型的, 我不想让其他人调用, 只想让这两个特殊的函数进行调用, 因此我们要改变这个方法的定义方式, 将这个 public 改为 private
加入 private 是为了给默认方法服务的
加上 private static 是给静态方法服务的
接口的应用
我们可以把多个类可能用到的方法都定义到接口里面
- 接口代表规则,是行为的抽象。想要让哪个类拥有一个行为,就让这个类实现对应的接口就可以了。
- 当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态。
适配器设计模式
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
简单来说, 设计模式就是各种套路
如果我们接口中有 10 个方法, 但是我们只想用其中一个, 由于接口的规则, 我们必须要进行所有方法的重写, 这种方法很不方便
因此我们设计了一种方式, 我们在套一层, 这一层对所有的方法进行重写, 然后我们在其他的类在进行使用这个接口中的方法时, 我们只需要继承上一个类就行了.
当一个接口中抽象方法过多,但是我只要使用其中一部分的时候,就可以适配器设计模式
书写步骤:
- 编写中间类 XXXAdapter,实现对应的接口
- 对接口中的抽象方法进行空实现
- 让真正的实现类继承中间类,并重写需要用的方法
- 为了避免其他类创建适配器类的对象,中间的适配器类用 abstract 进行修饰
此时因为继承了这个中间类, 但是有可能我们的测试类还有其他的类, 我们这个时候应该把这个测试类的父类, 移动到这个中间类的父亲, 然后再继承