Java
中的 接口
定义为用于指定实现类行为的抽象类型,Java接口包含 静态常量
和 抽象方法
, 1.8以后还有 默认方法
与 静态方法
。一个类能够实现多个接口。
在Java中,接口是使用 interface
关键字声明的。在 JDK8
以前接口中的全部方法都是 隐式公开
和 抽象
的, 1.8版本以后能够在接口中定义静态方法与使用 default
声明的带 方法体
的方法。java
抽取一系列对象的公共特征, 声明方法后进行统一实现, 例如猫和老鼠都是动物, 均可以爬或者叫等等, 这个时候咱们定义一个动物接口, 声明爬行和叫声的公共抽象方法, 建立猫和老鼠的类进行实现动物接口 markdown
优势: 当增长一个公共抽象方法, 例如在动物接口中增长 毛色
方法, 这样咱们不用去用脑去记忆有多少动物实现了它, 由于编译的时候会报错误, 很清晰的给动物实现类增长方法, 而无需去担忧漏掉某个动物没有毛色 ide
代码实现: code
interface Animal { public void move(); } class Cat implements Animal { public void move(){ System.out.println("猫行走的方法..."); } } class Dog implements Animal { public void move(){ System.out.println("狗行走的方法..."); } }
给动物增长一个毛色 对象
interface Animal { // ...其余方法 public void color(); }
这个时候若是Cat
和Dog
类若是不重写color
方法的话,就会编译报错 blog
之前的接口向后兼容性很差, 例如我想在动物类中增长一个如何食用该动物, 那么总不能每一个动物都要实现吧, 因此就须要这种能够不实现这个方法接口
interface Animal { default void howToEat(){ System.out.println("Animal:实现了这个接口的类能够不实现这个方法"); } }
那么问题来了, 假若有一个兔子
类, 在实现了Animal
的同时又实现了Mammal
(哺乳动物), 而两个接口中都包含howToEat
方法 get
interface Mammal { default void howToEat(){ // 实现了这个接口的类能够不实现这个方法 System.out.println("Mammal:哺乳动物食用方法..."); } } public class Rabbit implements Animal, Mammal{ }
上述代码编译出错, 以下: it
这个时候咱们就要重写howToEat
方法了 编译
public class Rabbit implements Animal, Mammal { @Override public void howToEat() { System.out.println("麻辣兔头"); } }
假如我想获取哺乳动物的腿的数量, 我又不想去调取其实现类, 或者每一个实现类写其有几条腿或者爪子什么之类的
public interface Mammal { static int getLegByName(String name) { switch (name) { case "兔子": return 4; case "鸭子": return 2; default: return 0; } } }