学完继承、学完多态,但面对汹涌而来:ocean:的接口,相信很多同学都不知所措,因此我耗费几天几夜的时间,搜寻大量书籍资料,苦心闭关钻研,写出了一篇关于 Java 的接口从入门小白到精通大佬的学习之路,相信这篇文章一定对您有所帮助:book:
🌳接口的基本概念引入
Java 接口是一系列方法的声明,是一些方法特征的集合
-
对于接口,它是 Java 中一个新增的知识点,而 C++中没有,因为 Java 有一个缺陷就是==不可以实现多继承==,只可以单继承,这就限制了有些功能的使用,于是为了让 Java 也能有这种能力,因为提出了接口的概念
-
对于接口的基本概念,大家应该要回想一下我们上一文所讲的 abstract 抽象类的概念,因为接口它与抽象类非常类似,在抽象类中我们可以了解到其实除了不可以实现一些抽象方法外,其余的和正常的类没有什么本质的区别,一些常量、变量,私有、静态方法都可以定义,但是在接口中,就只能有抽象方法以及常量,而且接口中所有抽象方法的访问权限都是 public 公开的,因为它也算是 static 静态方法,所以可以省略 public 和 static 这两个关键字
-
但是从 JDK8 开始,就有了一些改变,接口中也可以定义 default 和 private 关键字修饰的方法,对于 default 关键字修饰的方法,不可以将此关键字省略,因为在接口体中不允许定义通常的带方法体的 public 实例方法;而对于 private 修饰的方法,则是配合 default 默认方法进行使用,即将某些算法封装在 private 方法中,供接口中的实例方法调用
🌳如何去定义和实现一个接口
了解了接口的基本概念之后,是不是很想知道一个接口时怎么去定义和实现呢,让我们马上来看一看吧
🔑【interface 关键字】
-
首先最基本的定义一个接口,对于接口,如果你觉得有一些方法它们有一个功能的类名,那你就可以把它定义为一个接口,在这个接口中去定义一些抽象方法,比方是大家都会运动,运动的方式有很多,比方说跑步、游泳等等,但是你做这些事情的方式的方式和节奏和人家专业运动员又不一样,所以可以由不同的类去继承这个接口,然后去实现具体的对应的功能,
public interface Sport {
void run(); //跑步
void swim(); //游泳
}
复制代码
-
这和类的定义很相似,细心的小伙伴可以看出来这是将 class 关键字换成类 inferface 关键字,但是变得可不止这一种哦,接口可是有它的专属图表的:sparkler:
IDEA
eclipse
-
这两个 Java 编译器应该是大家用的最用的了,对于接口,细心的小伙伴应该可以发现,存在一个【大写的 I】,这个标志就是【interface】的首字母大写了,相信这点很多人都没有发现吧
🔑【implements 关键字】
-
好,说完如何入定义一个接口,接下去就来讲讲怎么去实现一个接口吧
-
那就是用【implements 】这个关键字,通过一个具体的类去实现
public class People implements Sport{
}
复制代码
-
但是这样的话就会出现报错,这个我们在继承抽象类的时候就有说过,继承一个抽象类,就要去重写其所有的抽象方法
public class People implements Sport{
@Override
public void run() {
System.out.println("我会慢跑🏃");
}
@Override
public void swim() {
System.out.println("我会自由泳🏊");
}
}
关注公众号【编程程序V】,分享更多Java技术前沿文章,Java学习面试资源。
【注意事项】
-
对于抽象类的话,如果你用一个抽象类去继承,那么你就不用重写这个抽象方法,当然对于接口也是一样
-
如果一个非 abstract 类实现了某个接口,那么这个类就必须重写该接口的所有抽象方法
-
如果一个 abstract 类实现了某个接口,那么这个类可以选择重写接口中的抽象方法或者该接口的抽象方法
🌳接口特点及作用
了解了接口的定义和实现之后,接下来我们来说一说接口有哪些特点以及其具体的作用
🍃接口的特点
-
①接口虽与抽象类相似,但是比抽象类更加抽象,却不需要写 abstract 关键字,因为接口中所有方法都时抽象的,因此可以省略这个关键字
-
②接口中只可以有常量,而且都是 public、static、final 关键字修饰的,但是不可以有变量
-
③接口没有构造方法,因此不可以用 new 关键字去创建接口的对象,而是要用一个具体的类去 implements 实现这个接口
-
④一个类可以实现多个接口,一个接口可以继承多个接口【有点抽象,上代码】
public interface Sport {
void run();
void competition();
}
复制代码
public interface Law {
void rule();
}
复制代码
public class PingPongMan implements Sport,Law{
private String name;
public PingPongMan(String name) {
this.name = name;
}
@Override
public void rule() {
System.out.println(name + "必须遵纪守法");
}
@Override
public void run() {
System.out.println(name + "必须参加训练");
}
@Override
public void competition() {
System.out.println(name + "必须参加比赛");
}
}
复制代码
public class Test {
public static void main(String[] args) {
PingPongMan p = new PingPongMan("张继科");
p.run();
p.competition();
p.rule();
}
}
复制代码
-
上述代码实现的是一个类实现多个接口,这个类不是一个抽象类,那就要重写实现接口的中的所有抽象方法
public interface Law {
void rule();
}
复制代码
public interface People {
void sleep();
void eat();
}
复制代码
public interface Sport extends Law,People{
void run();
void competition();
}
复制代码
-
好,具体测试不给出了,主要是看这个接口可以继承多个接口,可以看出 Sport 接口使用了 extends 关键字继承类 Law 和 People 这两个接口
以上的这==两个特点很重要==,也是弥补了 Java 类不能多继承的缺陷
-
⑤一个类,它可以在继承父类的情况下同时实现接口
class Dog extends Animal implements Runnging,Drinking{
}
复制代码
📕接口的作用和意义
-
有些刚刚接触 Java 接口的小伙伴就很疑惑,这个接口到底是用来干嘛的呢,它究竟有什么具体的作用
-
首先我们来总的概括一下,就是一句话:【定义一个公共规范,实现一个统一访问】
-
对于公共规范这个概念,就是大家都认可的,是一种标准,就像是 USB(通用串行总线)一样,这个接口是很多家公司联合提出的,因此属于一个规范,在日常生活中,我们使用的很多设备都拥有 USB 接口,这个 USB 接口呢,它就是 Java 中所说的接口,如果有一个物件,比如说笔记本,拥有这个接口,也相当于是实现了这个接口,那就说明笔记本这个类有了 USB 这个功能,外部设备便可以与它产生一个联系,比如说最常见的 U 盘,只要是有 USB 接口的地方,那么这个 U 盘都可以使用,这么说大家应该有点清楚了吧,==下面会更加详细地深入了解接口==
-
对于统一访问,举个例子,对于 LOL 这款游戏大家应该都玩过,一个英雄,是不是一定会有相同的功能,比如说攻击、点塔、补刀这些,但是 LOL 中 157 个英雄,假设它们都对应一个类,难道在每个英雄类中都去写这三个功能吗,那一定不会,这是就可以定义一个基本英雄功能接口,里面封装了所有英雄所具备的基本能力,然后所有英雄类都去访问这个接口就可以
🌳接口的 UML 图(类图)
初步入门了接口后,接下去我们就要了解接口与它的实现类之间所存在的逻辑框架关系,也就是类图,这可以进一步帮助我们去理解接口
🍃UML 图的基本概念
统一建模语言(Unified Modeling Lan