写点什么

Java 中 Interface 天天都在写,你知道其背后的原理是什么吗?

作者:wljslmz
  • 2022 年 9 月 30 日
    江苏
  • 本文字数:2764 字

    阅读完需:约 9 分钟

Java中Interface天天都在写,你知道其背后的原理是什么吗?

接口是 java 中的核心概念之一,Java 接口是 Java 编程语言的核心部分,不仅在 JDK 中而且在 Java 设计模式中也被广泛使用,大多数框架大量使用 java 接口。


那么什么是接口?为啥需要使用接口?接口应该怎么使用?本文一一给大家介绍。

一、什么是接口?

在 Java 中,接口是一种抽象类型,包含方法和常量变量的集合,它是 Java 中的核心概念之一,用于实现抽象、多态和多重继承。



Java 接口是方法名称的集合,只是名称,没有函数体,这些函数是作为接口定义的工作的一部分执行的。


例如,如果我们有一个动物类,动物可能会有许多不同的动作,一个类可以实现任意数量的接口。

二、为啥需要使用接口?

  • 数据抽象

  • 实现多重继承

  • 允许不同的对象轻松交互

  • 促进软件的重用


这里我们可以举个例子给大家说明一些下,为啥我们需要接口。


如果你有个需求,猫咪要集成动物类和宠物类:



但是 Java 是不支持多集成的,所以这个时候你应该怎么办?


那肯定是使用接口去实现,猫咪可以继承动物类,实现宠物类。



我们用代码的形式简单去实现一下。


首先写一个 Pet 接口:


package com.wangrui.kmz.test;
/** * @author: wangrui * @date: 2022/9/30 6:39 * @description: 宠物接口 */public interface Pet {
/** * 奔跑方法 */ void run();}
复制代码


然后写一个猫咪的类去实现 Pet 接口:


package com.wangrui.kmz.test;
/** * @author: wangrui * @date: 2022/9/30 6:41 * @description: */public class Cat implements Pet{
@Override public void run() { System.out.println("我是猫咪,我实现了Pet接口,并重写了run方法。"); }
public static void main(String[] args) { Cat cat = new Cat(); cat.run(); }}
复制代码


运行结果:


我是猫咪,我实现了Pet接口,并重写了run方法。
复制代码



这就是接口的写法。

三、接口有哪些规则?

接口在使用过程中,有很多规则,我们必要要牢记,下面列举几个:


  1. 不能直接实例化接口,需要写具体的类去实现它。

  2. 接口可以为空,可以没有方法或变量。

  3. 接口中不能出现 final 关键字。

  4. 接口不能有构造函数,因为我们不能实例化它们,而且接口不能有带主体的方法.

  5. 实现接口的类必须为其所有方法提供实现,除非它是抽象类。

四、接口的优缺点

4.1 优点

  • 接口可以帮助我们实现抽象。

  • Java 中不允许多继承,但是可以实现多个接口。

  • 接口可以实现松耦合,一个类的变化不会影响其他类。

4.2 缺点

  • 一个接口可以有多个实现类,所以但凡开始设计这个接口没有设计好,后期想要修改的时候,那么实现这个接口的所有类也要跟着修改。

五、接口中其他重要点

5.1 默认方法

随着 Java 8 的发布,我们现在可以在接口内添加带有实现的方法,这些方法称为默认方法。


要在接口中声明默认方法,我们使用 default 关键字,例如:


package com.wangrui.kmz.test;
/** * @author: wangrui * @date: 2022/9/30 6:39 * @description: 宠物接口 */public interface Pet {
/** * 奔跑方法 */ void run();
/** * 默认方法 */ default void getAction(){ System.out.println("接口的默认方法"); }}
复制代码


有没有疑问,为啥要引入默认方法?


如果我们需要在接口中添加一个新方法,可以在接口中添加方法而无需实现,但是这个不太现实,因为你一旦在接口中定义了一个新的方法,那么所有实现这个接口的实现类必须要重写这个新的方法,这肯定不是我们想要的结果


为了解决这个问题,Java 引入了默认方法,默认方法像普通方法一样被继承。


我们用代码的形式给大家演示一下:


接口 Pet:


package com.wangrui.kmz.test;
/** * @author: wangrui * @date: 2022/9/30 6:39 * @description: 宠物接口 */public interface Pet {
/** * 奔跑方法 */ void run();
/** * 默认方法 */ default void dance(){ System.out.println("我会跳舞"); }}
复制代码


实现类 1-猫咪:


package com.wangrui.kmz.test;
/** * @author: wangrui * @date: 2022/9/30 6:41 * @description: */public class Cat implements Pet{
@Override public void run() { System.out.println("我是猫咪,我实现了Pet接口,并重写了run方法。"); }
@Override public void dance() { System.out.println("我是猫咪,我实现了Pet的默认方法,我会跳舞"); }}
复制代码


实现类 2-狗狗:


package com.wangrui.kmz.test;
/** * @author: wangrui * @date: 2022/9/30 7:05 * @description: */public class Dog implements Pet{
@Override public void run() { System.out.println("我是狗狗,我实现了Pet接口,并重写了run方法。"); }}
复制代码


测试类:


package com.wangrui.kmz.test;
/** * @author: wangrui * @date: 2022/9/30 7:07 * @description: */public class Test {
public static void main(String[] args) { Cat cat = new Cat(); cat.run(); cat.dance();
Dog dog = new Dog(); dog.run(); }}
复制代码


输出:


我是猫咪,我实现了Pet接口,并重写了run方法。我是猫咪,我实现了Pet的默认方法,我会跳舞我是狗狗,我实现了Pet接口,并重写了run方法。
复制代码



我们注意到猫咪类有实现 Pet 接口中的默认方法 dance(),但是狗狗类没有实现该方法,这个就体现了灵活性,默认方法只是其中一个或者多个实现类需要用到。

5.2 静态方法

Java 8 中还引入了静态方法,所谓静态方法,就是用关键字 static 定义的方法。与 Interface 中的其他方法不同,这些静态方法包含函数的完整定义,并且由于定义完整且方法是静态的,因此这些方法在实现类中不能被覆盖或更改。


接口中的静态方法可以在接口中定义,但不需要在实现类中重写。


我们直接上代码:


Pet 接口:


package com.wangrui.kmz.test;
/** * @author: wangrui * @date: 2022/9/30 6:39 * @description: 宠物接口 */public interface Pet {
/** * 静态方法 */ static void eat(){ System.out.println("我是静态方法!"); }}
复制代码


Cat 实现类:


package com.wangrui.kmz.test;
/** * @author: wangrui * @date: 2022/9/30 6:41 * @description: */public class Cat implements Pet{}
复制代码


Test 测试类:


package com.wangrui.kmz.test;
/** * @author: wangrui * @date: 2022/9/30 7:07 * @description: */public class Test {
public static void main(String[] args) { Pet.eat(); }}
复制代码


输出:


我是静态方法!
复制代码

六、总结

接口是 java 中非常重要也是很常用的,本文介绍了接口的定义、优缺点、使用,还有 java8 新引入的概念:默认方法、静态方法,希望本文对您学习接口有所帮助,有任何问题,欢迎在下方评论区与我讨论。

发布于: 刚刚阅读数: 3
用户头像

wljslmz

关注

极致主义者,追求技术的路上,勇往直前! 2021.05.24 加入

公众号:网络技术联盟站 👍InfoQ签约作者 👍阿里云社区签约作者 👍华为云 云享专家 👍BOSS直聘 创作王者 👍腾讯课堂创作领航员 博客+论坛:https://www.wljslmz.cn 工程师导航:https://www.wljslmz.com

评论

发布
暂无评论
Java中Interface天天都在写,你知道其背后的原理是什么吗?_Java_wljslmz_InfoQ写作社区