Java 程序员都知道要面向接口编程,那 Java 中的接口除了定义接口方法之外还能怎么用你知道吗?今天阿粉就来带大家看一下 Java 中的接口还可以有哪些用法。

基本特性

我们先看一下接口的基本特性

  1. 接口的定义需要使用关键字 interface
  2. 接口定义的所有方法默认都是 public abstract
  3. 当一个具体的 class 去实现一个interface时,需要使用implements 关键字;
  4. 接口之间是可以多继承,而类是只能单继承的;

如下所示,我们定义一个接口

package com.example.demo.inter;

import java.io.Serializable;
import java.util.RandomAccess; /**
* <br>
* <b>Function:</b><br>
* <b>Author:</b>@author java 极客技术<br>
* <b>Date:</b>2022-09-24 17:38<br>
* <b>Desc:</b>无<br>
*/
public interface ITest extends Serializable, RandomAccess { public abstract String sayHello();
String sayHello2();// public abstract 可以省略 }

默认方法

JDK 8 之前接口是不支持默认方法的,在 JDK 8 之后接口支持默认方法,默认方法采用关键词 default 声明。

public interface ITest extends Serializable, RandomAccess {

  public abstract String sayHello();
String sayHello2();// public abstract 省略 // 默认方法
default String sayHello3() {
return "hello3";
} }

默认方法跟抽象方法不一样,接口中定义的抽象方法,当接口被其他类实现的时候都需要全部实现,但是默认方法是不需要被实现就可以直接使用的,类似于直接调用父类的方法一样,所以在很多时候,我们已经继承了一个类,还想有一个能用但是不想每个子类都实现的方法的时候,就可以考虑增加一个接口的默认方法来使用,简单来说就是实现类可以不覆写 default 方法。

default方法存在的目的是,在我们已经完善的项目中,如果我们直接给一个接口增加一个方法,在没有默认方法的时候就需要给所有的实现类都实现对应的方法,但是这个方法又不一定是每个实现类都需要的,所以这个时候默认方法就很好的解决了这个问题,我们只需要增加一个默认方法,然后在需要使用的实现类中进行实现或者使用就可以了,其他的实现类不需要改动任何的代码。

标记

接口还有一个很常见的功能那就是标记功能,这么说可能你没有印象,但是到提到序列化接口 java.io.Serializable; 你肯定知道,我们经常在对应的 POJO 中都会实现这个序列化接口,而这个序列化的接口如果看过源码的小伙伴肯定知道里面是没有内容的。

同样的功能除了序列化的接口,类似的空接口还有很多,比如 java.util.RandomAccess 也是空接口,之前阿粉也写过关于 RandomAccess 这个接口的用途,感兴趣的可以再去看看。 RandomAccess 明明是个空接口,能有什么用呢?

通过源码我们可以知道 RandomAccess 是用来标识子类是否实现了该接口,如果实现了则走实现了的逻辑,没有实现就走没有实现的逻辑,所以我们在日常开发中也可以利用这个特性,当我们有不同的子类需要根据情况进行不同的实现逻辑的时候就可以采用定义一个空接口来标记一下,方便后面的处理。

静态方法

跟默认方法一样,JDK 8 还支持在接口中增加静态方法,虽然说在接口中定义静态方法的做法不常见,但是当需要使用的时候也是可以支持的,避免在创建一个单独的工具类,跟在类中定义的静态方法一样,我们可以直接通过接口名称引用静态方法,当然静态变量也是可以的,使用方法一样。

public interface ITest extends Serializable, RandomAccess {

  public abstract String sayHello();
String sayHello2();// public abstract 可以省略
default String sayHello3() {
System.out.println(sayHello4());
return "hello3";
}
public static String sayHello4() {
return "hello4";
}
}

私有方法

大家有没有注意到,上面不管是默认方法还是静态方法其实都是 public 公开的,可以让实现类或者其他类直接使用,那有没有可能在接口中定义一个私有方法呢?在 JDK 9 之前是不可以的,JDK 9 却支持了,如下所示

  private void privateMethod() {
System.out.println("private私有方法被调用");
} private static void privateStaticMethod() {
System.out.println("private私有静态方法被调用");
}

从官方的文档中我们可以找到下面的描述,在 JDK 9 中接口支持私有方法,主要用于不同的非抽象方法中共享代码。

我们可以看到在 JDK 9 这样写是可以的

但是在 JDK8 就不行了,是无法编译通过的,会提示不允许使用 private 修饰符。

总结

今天阿粉给大家总结了一个接口的使用方法,后面在日常的开发中我们不单单只是在接口中定义抽象方法,也可以根据需求增加默认方法或者私有方法,以及在需要用到标记的时候也可以通过定义一个空接口来实现,怎么样是不是很棒,感觉动起来吧。最后觉得我们的文章有帮助,欢迎一键三连。



更多优质内容欢迎关注公众号【Java 极客技术】,我准备了一份面试资料,回复【bbbb07】免费领取。希望能在这寒冷的日子里,帮助到大家。

Java 中的接口还可以这样用,你知道吗?的更多相关文章

  1. JAVA中限制接口流量、并发的方法

    JAVA中限制接口流量可以通过Guava的RateLimiter类或者JDK自带的Semaphore类来实现,两者有点类似,但是也有区别,要根据实际情况使用.简单来说, RateLimiter类是控制 ...

  2. java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析

    java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...

  3. 第五节:详细讲解Java中的接口与继承

    前言 大家好,给大家带来详细讲解Java中的接口与继承的概述,希望你们喜欢 什么是接口(interface) 接口中的方法都是抽象方法,public权限,全是抽象函数,不能生成对象 interface ...

  4. java中map接口hashMap以及Enty之间的用法和关系

    java中map接口hashMap以及Enty之间的转换 首先说的是map接口: Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value ...

  5. Java学习笔记二十八:Java中的接口

    Java中的接口 一:Java的接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承 ...

  6. Java 中的接口有什么作用?以及接口和其实现类的关系?

    Java 中的接口有什么作用? - Ivony的回答 - 知乎 https://www.zhihu.com/question/20111251/answer/16585393 这是一个初学者非常常见的 ...

  7. java中的接口interface

    关于接口 接口描述了实现了它的类拥有什么功能.因为Java是强类型的,所以有些操作必须用接口去约束和标记.接口作为类的能力的证明,它表明了实现了接口的类能做什么. 类似与class,interface ...

  8. Java中的接口

    1.接口概念 <1>接口可以理解一种特殊的类,由全局常量和公共的抽象方法所组成 <2>类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不必关心这些类的内部数据,也 ...

  9. java中set接口的用法

    java中的set接口有如下的特点: 不允许出现重复元素: 集合中的元素位置无顺序: 有且只有一个值为null的元素. 因为java中的set接口模仿了数学上的set抽象,所以,对应的数学上set的特 ...

  10. 理解Java中的接口

    一.为什么要使用接口 假如有一个需求:要求实现防盗门的功能.门有"开"和"关"的功能,锁有"上锁"和"开锁"的功能. 分 ...

随机推荐

  1. ELasticsearch忘记密码后重置超级用户密码

    创建一个临时的超级用户TestSuper: [root@cfeea elasticsearch]# ./bin/elasticsearch-users useradd TestSuper -r sup ...

  2. 组件化开发3-cocoaPods私有库制作

    一.创建索引项目ZHMCSSpec 1-1 在代码托管网站上建立索引项目ZHMCSSpec(以这个名称为例) 1-2 在本地创建ZHMCSSpec,并与远程索引建立联系 pod repo add ZH ...

  3. 如何通过执行SQL为低代码项目提速?

    见多了SQL为代码开发提速,那么当低代码遇到SQL会擦出怎样的火花呢?本文将低代码和SQL结合进行介绍,让大家了解如何通过执行SQL为低代码项目提速. 背景 自从计算机诞生的一刻起,如何让计算机能够按 ...

  4. 「Chroot环境」Debian Testing amd64 on arm64

    这个是适用于ARM64环境的AMD64 Debian Testing系统.基于FEX转译.这个系统运行在ARM64的手机和电脑上,运行的软件是AMD64(X64)格式.下载链接提供桌面版和基础版.适用 ...

  5. Spring 深入——IoC 容器 01

    IoC容器的实现学习--01 目录 IoC容器的实现学习--01 简介 IoC 容器系列的设计与实现:BeanFactory 和 ApplicationContext BeanFactory load ...

  6. 实时营销引擎在vivo营销自动化中的实践 | 引擎篇04

    作者:vivo 互联网服务器团队 本文是<vivo营销自动化技术解密>的第5篇文章,重点分析介绍在营销自动化业务中实时营销场景的背景价值.实时营销引擎架构以及项目开发过程中如何利用动态队列 ...

  7. Rdt2.1 和 Rdt2.2的详细解释

    Rdt2.1 和 Rdt2.2的详细解释 目录 Rdt2.1 和 Rdt2.2的详细解释 这俩为啥会出现? 解决之道 Rdt 2.1 Rdt2.2 可靠数据传递中Rdt1.0, Rdt2.0, Rdt ...

  8. 20220925 - CSP-S 模拟赛 #2

    20220925 - CSP-S 模拟赛 #2 时间记录 \(8:00-8:20\) 浏览题面 \(8:20-8:45\) T1 想到了分块计算,但是在手推样例的过程中,发现样例的数据并不能真正构成一 ...

  9. PhpStorm 2020.1.2破解 | JetBrains PhpStorm 2020.1.2破解版 附破解文件

    直接去官网下载 2020.1.2的版本,版本一定要对得上  是2020.1.2版本 下面是破解的jar,几兆而已 --------------------- 链接:https://pan.baidu. ...

  10. 十、Pod的init containers

    Pod 的 init Containers Pod 我们可以分为两类,一种属于自主式 Pod ,还有一种属于控制器管理的 Pod . 一.Pod 的 initContainers 基本概念: ​Pod ...