我感觉两篇写的很好的博文
我的博客写的很简略, 如果想详细了解这个接口的相关概念, 我推荐下面这两个
java 基础-接口全网最详细的教程
JDK 8 后的接口新特性
接口可以理解成一种规则
接口是谁想用谁去对接
当我们需要给多个类但并不是全部的类定义规则的时候我们就要用到规则, 通过 implements 实现这个接口的功能.
抽象类是用来表示一些事物
接口表示一些行为
除此之外:
调用方式不同。调用抽象类时需要先实例化对象,然后通过对象调用成员变量和方法;调用接口时不需要实例化对象,直接使用接口名调用即可。
接口的文件名后缀依然是这个 .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 7 以前: 接口中只能定义抽象方法。
JDK 8 的新特性: 接口中可以定义有方法体的方法。(默认、静态)
JDK 9 的新特性: 接口中可以定义私有方法。
如果接口中新添加了一个新的规则, 此时的子类规则要全部进行修改否则就会报错, 这样的话不利于维护, 怎么办呢
如果接口中有方法体的方法就行了, 这样就不需要子代规则重新写了.
于是 JDK 8 之后出来了一种新的特性, 将函数用 default 来进行修饰, 可以在这个函数内部加入方法体.
[!example]
接口中定义的 default 方法, 在这个方法中我们可以写方法体
// JDK8之后我们可以定义这个方法的内部方法体
public default void drink(){
System.out.println("====喝====");
}
这个 drink 方法在实现接口的类中是不需要进行重写的, 因为它不是抽象方法, 所以这个方法可以直接被实现接口的类使用, 当然如果你想重写, 也是可以的.
default 不要求你进行强制的重写
静态方法不能够进行重写
静态方法, 只能通过接口名调用, 不能通过实现类名或者对象名调用
JDK 以前我们解决不同的方法的重复代码的方法, 就是定义一个新的方法
但是你这个新定义的方法是个 public 类型的, 我不想让其他人调用, 只想让这两个特殊的函数进行调用, 因此我们要改变这个方法的定义方式, 将这个 public 改为 private
加入 private 是为了给默认方法服务的
加上 private static 是给静态方法服务的
我们可以把多个类可能用到的方法都定义到接口里面
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
简单来说, 设计模式就是各种套路
如果我们接口中有 10 个方法, 但是我们只想用其中一个, 由于接口的规则, 我们必须要进行所有方法的重写, 这种方法很不方便
因此我们设计了一种方式, 我们在套一层, 这一层对所有的方法进行重写, 然后我们在其他的类在进行使用这个接口中的方法时, 我们只需要继承上一个类就行了.
当一个接口中抽象方法过多,但是我只要使用其中一部分的时候,就可以适配器设计模式
书写步骤:
此时因为继承了这个中间类, 但是有可能我们的测试类还有其他的类, 我们这个时候应该把这个测试类的父类, 移动到这个中间类的父亲, 然后再继承