接口首先我们来想想为什么需要接口这个东西呢假设现在有一个业务是在奥运会上我们需要定义出一个中国的游泳运动员假设是这样的class Chinese { }很显然作为中国人他首先是要有人的属性和行为那么他就要继承Person类class Chinese extends Person{ } class Person { }事实上作为游泳运动员他还要继承一个游泳运动员的抽象类以获得游泳的行为。但是很显然Java只会允许单继承的出现这时候我们就可以使用接口了因为一个类可以在继承一个类的同时实现无数个接口。接口代表着一种规范它定义了一组抽象方法和常量。用来描述一些实现这个接口的类应该具有哪些行为和属性。接口和类一样也是一种引用数据类型。定义方法[修饰符列表] interface 接口名{ }示例// 1. 定义一个“游泳”接口技能证书 // 注意不用 class用 interface 关键字 interface Swimmable { // 接口里面的方法默认全是 public abstract公开且抽象的 // 你甚至不需要写这两个关键字直接写返回类型和方法名就行 void swim(); } // 2. 定义一个“驾驶”接口 interface Driveable { void drive(); } // -------------------------------------------------- // 3. 见证奇迹的时刻一个中国人既是人又会游泳又会开车 // 语法先 extends (继承父类)再 implements (实现接口) class SuperChinese extends Person implements Swimmable, Driveable { // ① 必须还“亲爹”的债 Override public void greet() { System.out.println(你好我是全能超人); } // ② 必须还“游泳证书”的债 Override public void swim() { System.out.println(我会用自由泳横渡长江); } // ③ 必须还“驾驶证书”的债 Override public void drive() { System.out.println(我会开小汽车); } }接口也有对应需要遵守的规则绝对抽象接口里的方法只能是没有大括号的抽象方法默认自动加public abstract。你不能在接口里写具体的逻辑。绝对常量接口里不能有普通的变量里面所有的属性都会被 Java 默认当成public static final公开的静态常量。比如你写int MAX_SPEED 100;它其实是个改不了的常量。不能被实例化和抽象类一样你永远不能new Swimmable()。技能证书本身不能变成实体只有考取了证书的人类才能被实例化。类与类之间不能多继承但是接口和接口之间可以多继承。类和接口的关系我们叫做实现这里的实现也可以等同看做继承。使用implements关键字进行接口的实现。一个非抽象的类实现接口必须将接口中所有的抽象方法全部实现。语法是class 类 implements 接口A,接口B{}注意Java8之后接口中允许出现默认方法和静态方法(JDK8新特性)interface SmartPhone { // 传统的抽象方法子类必须实现 void call(); // 默认方法带有具体的代码逻辑 default void takePhoto() { System.out.println(使用默认的 1200 万像素摄像头拍照。); } } interface Calculator { // 抽象方法 int calculate(int a, int b); // 静态方法工具方法 static void printHelp() { System.out.println(这是一个计算器接口用于定义计算规则。); } }JDK9之后允许接口中定义私有的实例方法为默认方法服务的和私有的静态方法为静态方法服务的。所有的接口隐式的继承Object。因此接口也可以调用Object类的相关方法。还有一个要注意的那就是我们之前明明已经有了抽象类了为什么还需要去专门学一个接口呢明明抽象类也可以定义抽象方法啊首先就是我们刚刚说的类与类之间只有单继承而接口则可以多继承且当一个类具体实现时还可以同时实现多个接口再一个两者的侧重点也不一样抽象类主要是告诉你一个类的本质是什么比如上面的游泳抽象类就是在告诉你你需要的是一个会游泳的人而接口则是告诉你能做什么。一个是“是什么”一个是“会什么”。再一个抽象类的使用场景多是公共代码的提取比如说一组类有共同的属性和行为但行为的细节却有所不同需要子类自己去具体实现。而接口则用于一部分类需要这个方法但另一部分却不需要使用。主要是为了给需要的去提供扩展。最后就是二者语法的差异抽象类是必须要有构造器虽然二者都不能new出实例对象但抽象类的子类需要super()调用父类的构造器去完成实例化。且抽象类可以有成员变量和普通方法而接口则只有抽象方法和静态变量Java8之后对接口引入了默认方法原因是引入默认方式是为了解决接口演变问题接口可以定义抽象方法但是不能实现这些方法。所有实现接口的类都必须实现这些抽象方法。这会导致接口升级的问题当我们向接口添加或删除一个抽象方法时这会破坏该接口的所有实现并且所有该接口的用户都必须修改其代码才能适应更改。这就是所谓的接口演变问题。